【4.61】分析:按照親密數(shù)定義,要判斷數(shù)a是否有親密數(shù),只要計(jì)算出a的全部因子的累加和為b,再計(jì)算b的全部因子的累加和為n,若n等于a則可判定a和b是親密數(shù)。計(jì)算數(shù)a的各因子的算法:用a依次對i(i=1~a/2)進(jìn)行模運(yùn)算,若模運(yùn)算結(jié)果等于0,則i為 a的一個(gè)因子;否則結(jié)束對a的因子的計(jì)算。
參考答案:
#include
#include
main( )
{ int a, i, m, n;
printf("Friendly-numbers pair samller than 3000:\n");
for(a=1;a<3000;a++) /* 窮舉3000以內(nèi)的全部整數(shù) */
{ for(m=0,i=1;i<=a/2;i++ ) /* 計(jì)算數(shù)a的各因子,各因子之和存于m */
if(!(a%i))
m+=i; /* 計(jì)算m的各因子,各因子之和存于n */
for(n=0,i=1;i<=m/2;i++)
if(!(m%i))
n+=i;
if(n==a && a
printf(" %4d~%4d",a,m);
}
【4.62】參考答案:
#include
#include
main( ) /* 猜數(shù)程序 */
{ int magic; /* 計(jì)算機(jī)"想"的數(shù) */
int guess; /* 人猜的數(shù) */
int counter;
magic=rand( ); /* 通過調(diào)用隨機(jī)函數(shù)任意"想"一個(gè)數(shù) */
guess=magic-1; /* 初始化變量guess的值 */
counter=0; /* 計(jì)數(shù)器清零 */
while(magic != guess)
{ printf("guess the magic number:");
scanf("%d", &guess); /* 人輸入所猜的數(shù) */
counter++;
if(guess>magic)
printf("**** Wrong **** too hight\n");
else if(guess
printf("**** Wrong **** too low\n");
}
printf("**** Right ****\n");
printf("guess counter is %d\n", counter);
}
【4.63】分析:直接計(jì)算階乘的結(jié)果顯然超出整型數(shù)的范圍。此題的關(guān)鍵是如何減少計(jì)算中數(shù)的規(guī)模,注意在計(jì)算過程中出現(xiàn)0后,我們可以先行統(tǒng)計(jì)0的個(gè)數(shù),然后將0從結(jié)果中移去,另外,結(jié)果僅保存?zhèn)位數(shù)即可,其它位的數(shù)不會(huì)對0的個(gè)數(shù)產(chǎn)生影響。
參考答案:
main()
{ int i,n=0;
long s=1;
for(i=1;i<=1000;i++)
{ s=s*i;
while(s%10==0)
{ s=s/10;
n++;
}
s=s%10;
}
printf("n=%d,s=%d\n",n,s);
}
【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("%d ",b[i][j]);
printf("\n");
}
}
【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("count=%d number=%d\n",count,a[1]);
}
【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("%d %d: ",i,j);
scanf("%d",&a[i][j]);
}
for(i=0;i<5;i++)
{ for(j=0;j<5;j++)
printf("%5d",a[i][j]);
printf("\n");
}
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("SUN=%d\nACCOM=%d\na[%d]=%d\n",s1,s2,j,a[j][j]);
}
【4.67】參考答案:
#include "stdio.h"
main()
{ int i,n=0,a[4]={0};
printf("Please enter a digit:");
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("input Error!");
for(i=0;i<4;i++)
n=n*16+a[i];
printf("%d",n);
}
【4.68】參考答案:
main()
{ int i,n,k=16,a[16]={0};
printf("Please enter a digit:");
scanf("%d",&n);
while(n>0) /* 將十進(jìn)制數(shù)轉(zhuǎn)變?yōu)槎M(jìn)制數(shù) */
{ a[--k]=n%2;
n=n/2;
}
for(i=0;i<16;i++)
printf("%2d",a[i]);
}
【4.69】參考答案:
#include
main()
{ int i,j,m,s,k,a[100];
for(i=1;i<=100;i++ ) /* 尋找1000以內(nèi)的完數(shù) */ { m=i;s=0;k=0;
while(m>0) /* 尋找i的因子 */
{ for(j=1;j
if(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;j
printf("%4d",a[j]);
printf("==%4d\n",i);
}
}
}
【4.70】參考答案:
main()
{ int i,j,k,n,m=1,r=1,a[2][100]={0}; printf("Please enter n:");
scanf("%d",&n);
for(i=0;i
{ printf("a[%d]= ",i);
scanf("%d",&a[0][i]);
}
while(m<=n) /* m記錄已經(jīng)登記過的數(shù)的個(gè)數(shù) */
{ for(i=0;i
{ if(a[1][i]!=0) /* 已登記過的數(shù)空過 */
continue;
k=i;
for(j=i;j
if(a[1][j]==0 && a[0][j]
a[1][k]=r++; /* 記錄名次,r為名次 */
m++; /* 登記過的數(shù)增1 */
for(j=0;j
if(a[1][j]==0 && a[0][j]==a[0][k])
{ a[1][j]=a[1][k];
m++;
}
break;
}
}
for(i=0;i
printf("a[%d]=%d, %d\n",i,a[0][i],a[1][i]);
}
【4.71】參考答案:
#include
main()
{ int i,j,k=0,m=2,s,r=0,a[500]; printf("%4d ",m);
for(i=3;i<=2000;i++ )
{ for(j=2;j<=i-1;j++)
if(i%j==0) break;
if(j==i)
{ printf("%4d ", i );
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("\nresult=%d\n",r);
}
【4.72】分析:本問題的思路很多,我們介紹一種簡單快速的算法。
首先求出三位數(shù)中不包含0且是某個(gè)整數(shù)平方的三位數(shù),這樣的三位數(shù)是不多的。然后將滿足條件的三位數(shù)進(jìn)行組合,使得所選出的三個(gè)三位數(shù)的九個(gè)數(shù)字沒有重復(fù)。程序中可以將尋找滿足條件三位數(shù)的過程和對該三位數(shù)進(jìn)行數(shù)字分解的過程結(jié)合起來。
參考答案:
#include
main( )
{ int a[20],num[20][3],b[10]; /* a: 存放滿足條件的三位數(shù) */
/* num:滿足條件的三位數(shù)分解后得到的數(shù)字,b: 臨時(shí)工作 */
int i,j,k,m,n,t,flag;
printf("The 3 squares with 3 different digits each are:\n");
for(j=0,i=11;i<=31;i++) /* 求出是平方數(shù)的三位數(shù) */
if(i%10 != 0) /* 若不是10的倍數(shù),則分解三位數(shù) */
{ k=i*i; /* 分解該三位數(shù)中的每一個(gè)數(shù)字 */
num[j+1][0]=k/100; /* 百位 */
num[j+1][1]=k/10%10; /* 十位 */
num[j+1][2]=k%10; /* 個(gè)位 */
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]) )
/* 若分解的三位數(shù)字均不相等 */
a[++j]=k; /* j:計(jì)數(shù)器,統(tǒng)計(jì)已找到的滿足要求的三位數(shù) */
}
for(i=1;i<=j-2;++i ) /* 從滿足條件的三位數(shù)中選出三個(gè)進(jìn)行組合 */
{ b[1]=num[i][0]; /* 取第i個(gè)數(shù)的三位數(shù)字 */
b[2]=num[i][1];
b[3]=num[i][2];
for(t=i+1;t<=j-1;++t)
{ b[4]=num[t][0]; /* 取第t個(gè)數(shù)的三位數(shù)字 */
b[5]=num[t][1];
b[6]=num[t][2];
for(flag=0, m=1;!flag&&m<=3;m++) /* flag:出現(xiàn)數(shù)字重復(fù)的標(biāo)記 */
for(n=4;!flag&&n<=6;n++) /* 判斷前兩個(gè)數(shù)的數(shù)字是否有重復(fù) */
if(b[m]==b[n]) flag=1; /* flag=1:數(shù)字有重復(fù) */
if(!flag)
for(k=t+1;k<=j;++k)
{ b[7]=num[k][0]; /* 取第k個(gè)數(shù)的三位數(shù)字 */
b[8]=num[k][1];
b[9]=num[k][2];
/* 判斷前兩個(gè)數(shù)的數(shù)字是否與第三個(gè)數(shù)的數(shù)字重復(fù) */
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) /* 若均不重復(fù)則打印結(jié)果 */
printf("%d, %d, %d\n",a[i],a[t],a[k]);
}
}
}
}
【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;n
if(a[n]!=b[k-n-1])
break;
if(n==k)
printf("%d\n",i);
}
}
【4.74】參考答案:
#include
int pos[101],div[101];
main ()
{ int m, n, i, j;
printf("Please input m/n(<0
scanf("%d%d", &m,&n);
printf("%d/%d=0.", m, n);
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("%d",div[j]);
break;
}
if(pos[m]!=0)
{ for( j=1;j<=i;j++) printf("%d",div[j]);
printf("\nloop: start=%d, end=%d",pos[m], i);
break;
}
}
printf("\n");
}
【4.75】參考答案:
#include "stdio.h"
int a[20],b[20];
main()
{ int t=0,*m,*n,*k,*j,z,i=0;
printf("Input number 1:");
do
{ a[++t]=getchar()-'0';
}while(a[t]!=-38);
printf("Input number 2:");
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)%10;
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;
}
while (*(j++)!=-38) printf("%d",*(j-1));
printf("\n");
}