【4.57】参考答案: main()
{ int i,n,k,a[3],b[3]; for(i=248;i<=343;i++) { for(n=i,k=0;n>0;n/=7) a[k++]=n%7;
for(n=i,k=0;n>0;n/=9) b[k++]=n%9; if(k==3)
for(n=0;nif(a[n]!=b[k-n-1]) break; if(n==k)
printf(\; } }
【4.58】参考答案: main()
{ int i,j,k,m,error; for(i=6;i<=2000;i+=2) { error=1; for(j=2;j
{ for(k=2;kif(j%k==0) /* j能够被小于它的一个数整除就不是素数 */ break; if(k>=j) /* j是素数 */ { m=i-j; for(k=2;kif(m%k==0) break; if(k>=m) /* m也是素数,输出结果 */ { printf(\; error=0; break; } } } if(error) printf(\; } } 【4.59】分析:可采用穷举法,依次取1000以内的各数(设为i),将i的各位数字分解后,据阿姆斯特朗数的性质进行计算和判断。 参考答案: #include main() { int i,t,k,a[4]={0}; printf (\; for(i=2;i<1000;i++) /* 穷举要判定的数i的取值范围1~1000 */ { for(t=0,k=1000;k>=10;t++) /* 截取整数i的各位(从高位向低位) */ { a[t]=(i%k)/(k/10); /* 分别赋给a[0]~a[3] */ k /= 10; } if(a[0]*a[0]*a[0]+a[1]*a[1]*a[1]+a[2]*a[2]*a[2]+a[3]*a[3]*a[3]==i) printf(\; /* 判断i是否为阿姆斯特朗数,*/ /* 若满足条件,则输出 */ } } 【4.60】参考答案: main( ) { int j,k,n,m; printf(\; scanf(\; for(j=2;j{ for(k=2;kif(j%k==0) break; /* j能够被小于它的一个数整除就不是素数 */ if(k>=j) /* j是素数 */ { m=n-j; for(k=2;kif(m%k==0) break; if(k>=m) /* m也是素数,输出结果 */ { printf(\; break; } } } } 【4.61】分析:按照亲密数定义,要判断数a是否有亲密数,只要计算出a的全部因子的累加和为b,再计算b的全部因子的累加和为n,若n等于a则可判定a和b是亲密数。计算数a的各因子的算法:用a依次对i(i=1~a/2)进行模运算,若模运算结果等于0,则i为 a的一个因子;否则结束对a的因子的计算。 参考答案:
#include #include main( )
{ int a, i, m, n;
printf(\; for(a=1;a<3000;a++) /* 穷举3000以内的全部整数 */
{ for(m=0,i=1;i<=a/2;i++ ) /* 计算数a的各因子,各因子之和存于m */ if(!(a%i))
m+=i; /* 计算m的各因子,各因子之和存于n */ for(n=0,i=1;i<=m/2;i++) if(!(m%i)) n+=i;
if(n==a && aprintf(\~M\; }
【4.62】参考答案:
#include #include main( ) /* 猜数程序 */ { int magic; /* 计算机\想\的数 */ int guess; /* 人猜的数 */ int counter;
magic=rand( ); /* 通过调用随机函数任意\想\一个数 */ guess=magic-1; /* 初始化变量guess的值 */ counter=0; /* 计数器清零 */ while(magic != guess)
{ printf(\;
scanf(\; /* 人输入所猜的数 */ counter++; if(guess>magic)
printf(\;
else if(guessprintf(\; }
printf(\;
printf(\; }
【4.63】分析:直接计算阶乘的结果显然超出整型数的范围。此题的关键是如何减少计算中数的规模,注意在计算过程中出现0后,我们可以先行统计0的个数,然后将0从结果中移去,另外,结果仅保存个位数即可,其它位的数不会对0的个数产生影响。 参考答案: main() { int i,n=0; long s=1;
for(i=1;i<=1000;i++)
{ s=s*i; while(s==0) { s=s/10; n++; } s=s; }
printf(\; }
【4.64】参考答案: main()
{ int i,j,b[3][2];
int a[2][3]={{1,2,3},{4,5,6}}; for(i=0;i<=1;i++) for(j=0;j<=2;j++) b[j][i]=a[i][j]; for(i=0;i<=2;i++) { for(j=0;j<=1;j++) printf(\; printf(\; } }
【4.65】参考答案: main()
{ int i,count=0,a[11]={0,10,2,8,22,16,4,10,6,14,20}; while(1)
{ for(i=1;i<=10;i++) a[i-1]=a[i-1]/2+a[i]/2; a[10]=a[10]/2+a[0]; for(i=1;i<=10;i++) if(a[i]%2==1) a[i]++; for(i=1;i<10;i++) if(a[i]!=a[i+1]) break; if(i==10) break; else { a[0]=0; count++; }
}
printf(\; }
【4.66】参考答案: main()
{ int i,j,s1=0,s2=1,a[5][5]; for(i=0;i<5;i++) for(j=0;j<5;j++) { printf(\; scanf(\; }
for(i=0;i<5;i++) { for(j=0;j<5;j++) printf(\; printf(\; } j=0;
for(i=0;i<5;i++) { s1=s1+a[i][i];
if(i%2==0) s2=s2*a[i][i]; if(a[i][i]>a[j][j]) j=i; }
printf(\; }
【4.67】参考答案: #include \main()
{ int i,n=0,a[4]={0};
printf(\;
for(i=0;i<4 && (a[i]=getchar())!='\\n';i++) ; for(i=0;i<4;i++)
if(a[i]>=48&&a[i]<=57) a[i]=a[i]-48; else if(a[i]>=65&&a[i]<=69) a[i]=a[i]-55; else if(a[i]>=97&&a[i]<=102) a[i]=a[i]-87; else printf(\; for(i=0;i<4;i++) n=n*16+a[i]; printf(\;