}
【4.68】参考答案: main()
{ int i,n,k=16,a[16]={0}; printf(\; scanf(\;
while(n>0) /* 将十进制数转变为二进制数 */ { a[--k]=n%2; n=n/2; }
for(i=0;i<16;i++) printf(\; }
【4.69】参考答案: #include main()
{ int i,j,m,s,k,a[100];
for(i=1;i<=100;i++ ) /* 寻找1000以内的完数 */ { m=i;s=0;k=0; while(m>0) /* 寻找i的因子 */ { for(j=1;jif(m%j==0) { s=s+j; m=m/j; a[k++]=j; }
if(j>=m) break; }
if(s!=0&&i==s+m) { a[k++]=m;
for(j=0;jprintf(\; printf(\; } } }
【4.70】参考答案: main()
{ int i,j,k,n,m=1,r=1,a[2][100]={0}; printf(\; scanf(\;
for(i=0;i{ printf(\; scanf(\;
}
while(m<=n) /* m记录已经登记过的数的个数 */ { for(i=0;i{ if(a[1][i]!=0) /* 已登记过的数空过 */ continue; k=i;
for(j=i;jif(a[1][j]==0 && a[0][j] a[1][k]=r++; /* 记录名次,r为名次 */ m++; /* 登记过的数增1 */
for(j=0;jif(a[1][j]==0 && a[0][j]==a[0][k]) { a[1][j]=a[1][k]; m++; } break; } }
for(i=0;iprintf(\; }
【4.71】参考答案: #include main()
{ int i,j,k=0,m=2,s,r=0,a[500]; printf(\; for(i=3;i<=2000;i++ ) { for(j=2;j<=i-1;j++) if(i%j==0) break; if(j==i)
{ printf(\; a[k++]=i-m; m=i; } }
for(i=0;i{ s=0; for(j=i;j{ s=s+a[j]; if(s>=1898) break; }
if(s==1898) r++; }
printf(\; }
【4.72】分析:本问题的思路很多,我们介绍一种简单快速的算法。
首先求出三位数中不包含0且是某个整数平方的三位数,这样的三位数是不多的。然后将满足条件的三位数进行组合,使得所选出的三个三位数的九个数字没有重复。程序中可以将寻找满足条件三位数的过程和对该三位数进行数字分解的过程结合起来。 参考答案: #include main( )
{ int a[20],num[20][3],b[10]; /* a: 存放满足条件的三位数 */ /* num:满足条件的三位数分解后得到的数字,b: 临时工作 */ int i,j,k,m,n,t,flag;
printf(\; for(j=0,i=11;i<=31;i++) /* 求出是平方数的三位数 */ if(i != 0) /* 若不是10的倍数,则分解三位数 */ { k=i*i; /* 分解该三位数中的每一个数字 */ num[j+1][0]=k/100; /* 百位 */ num[j+1][1]=k/10; /* 十位 */ num[j+1][2]=k; /* 个位 */
if(!(num[j+1][0]==num[j+1][1] || num[j+1][0]==num[j+1][2] || num[j+1][1]==num[j+1][2]) ) /* 若分解的三位数字均不相等 */
a[++j]=k; /* j:计数器,统计已找到的满足要求的三位数 */ }
for(i=1;i<=j-2;++i ) /* 从满足条件的三位数中选出三个进行组合 */ { b[1]=num[i][0]; /* 取第i个数的三位数字 */ b[2]=num[i][1]; b[3]=num[i][2]; for(t=i+1;t<=j-1;++t)
{ b[4]=num[t][0]; /* 取第t个数的三位数字 */ b[5]=num[t][1]; b[6]=num[t][2];
for(flag=0, m=1;!flag&&m<=3;m++) /* flag:出现数字重复的标记 */ for(n=4;!flag&&n<=6;n++) /* 判断前两个数的数字是否有重复 */ if(b[m]==b[n]) flag=1; /* flag=1:数字有重复 */ if(!flag)
for(k=t+1;k<=j;++k)
{ b[7]=num[k][0]; /* 取第k个数的三位数字 */ b[8]=num[k][1]; b[9]=num[k][2];
/* 判断前两个数的数字是否与第三个数的数字重复 */
for(flag=0,m=1;!flag&&m<=6;m++) for(n=7;!flag&&n<=9;n++) if(b[m]==b[n]) flag=1;
if(!flag) /* 若均不重复则打印结果 */ printf(\; } } } }
【4.73】参考答案: 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.74】参考答案:
#include int pos[101],div[101]; main ()
{ int m, n, i, j;
printf(\; scanf(\; printf(\; for(i=1;i<=100;i++) { pos[m]=i; m*=10; div[i]=m/n; m=m%n; if(m==0)
{ for( j=1;j<=i;j++) printf(\;
break; }
if(pos[m]!=0)
{ for( j=1;j<=i;j++) printf(\; printf(\; break; } }
printf(\; }
【4.75】参考答案: #include \int a[20],b[20]; main()
{ int t=0,*m,*n,*k,*j,z,i=0; printf(\; do
{ a[++t]=getchar()-'0'; }while(a[t]!=-38);
printf(\; do
{ b[++i]=getchar()-'0'; }while(b[i]!=-38); if(t>i)
{ m=a+t;n=b+i;j=a;k=b;z=i; } else
{ m=b+i;n=a+t;j=b;k=a;z=t; }
while(m!=j)
{ (*(--n-1))+=(*(--m)+*n)/10; *m=(*m+*n);
if (n==k+1 && *k!=1 ) break; if (n==k+1 && *k) { n+=19;*(n-1)=1; }
if (n>k+z && *(n-1)!=1) break; }