c语言,求问编这个程序的人是什么思路?用到哪些数学知识?
Mobius函数见附件#include"stdio.h"#include"math.h"voidmain(){intn,m,a=2,p=0,x,r;printf("pleaseinputanaturalnumber:\n");scanf("%d",&n);r=n;if(n==1)printf("M(1)=1\n");elsedo{x=n%a;switch(x){case0:if((n/a)%a==0)m=0;elsep++;n=n/a;a++;break; }}while(n/a>=1);if(m==0)printf("m=%d\n",m);elsem=pow(-1,p);printf("M=(%d)=%d",r,m);}
我对程序做了少许改动。有的地方增加括号是为了容易理解,有的地方是必须加上去的。另外,程序的可读性以及优化可以进一步加以考虑。 #include "stdio。h" #include "math。
h" void main() { int n,m=1,a=2,p=0,x,r; //a表示因子,首先赋最小的素数2,另外,增加给m赋初值1(不然有漏洞,当然只要取非零整数都行) printf("please input a natural number:\n"); scanf("%d",&n); r=n; if(n==1) printf("M(1)=1\n"); else //n>1 do { x=n%a; switch(x) { case 0: //如果a是n的素数因子 { { if((n/a)%a==0) //如果a因子出现不止1次 m=0; //该函数的值必为0 else //如果a因子只出现1次 p++; //记录只出现一次的因子的个数的变量p自增1 } n=n/a; //从n中去掉一个a因子 a++; //a因子自增1 break; } default : //如果a不是n的素数因子 a++; //a因子自增1 break; } }while(n/a>=1); //当n不等于1时继续循环 if(m==0) //我前面增加给m赋初值1的目的在此 printf("M(%d)=%d",r,m); else { m=(int)pow(-1,p); //可以考虑通过判断p是奇数还是偶数来得到该函数的值 printf("M(%d)=%d",r,m); } } 。
答:LZ的代码中,双重循环变量的初始值及终值条件有问题。 现修改如下,请参考: #include "stdio.h" main() {int a[20],i,j,n...详情>>