C语言100例,C++100例 经典、实用、趣味程序设计编程百例精解(5)

2019-03-22 12:26

{ int i,t;

float a[3],b[3];

print(\for(i=11;i<=31;++i) //穷举平方三位数的取值范围 for(t=11;t<=31;++t) {

f(i*i,a); //分解平方三位数的各位,每位数字分别存入数组中 f(t*t,b);

if(sqrt(a[0]*10+b[0]) == (int)sqrt(a[0]*10+b[0]) && sqrt(a[1]*10+b[1]) == (int)sqrt(a[1]*10+b[1]) && sqrt(a[2]*10+b[2]) == (int)sqrt(a[2]*10+b[2]) ) {

printf(\若三个新的数均是完全平方数,则输出 } } }

/* ———————————————-

分解三位数n的各位数字,将各个数字从高到低依次存入指针s所指向的数组中 ————————————————*/ void f(int n,float* s) { int k;

for(k=1000;k>=10;++s) {

*s = (n%k) /(k/10); k /=10; } }

*运行结果

The possible perfect squares combinations are: 400 and 900 841 and 196 *思考题

求这样一个三位数,该三位数等于其每位数字的阶乘之和。 即 abc = a! + b! + c!

(正确结果:145 = 1! + 4! +5!)

24.阿姆斯特朗数

如果一个正整数等于其各个数字的立方和,则称该数为阿姆斯特朗数(亦称为自恋性数)。 如 407=43+03+73就是一个阿姆斯特朗数。试编程求1000以内的所有阿姆斯特朗数。 *问题分析与算法设计

可采用穷举法,依次取1000以内的各数(设为i),将i的各位数字分解后,据阿姆斯特朗数的性质进行计算和判断。 *程序说明与注释 #include int main() {

int i,t,k,a[3];

printf(\for(i=2;i<1000;i++) /*穷举要判定的数i的取值范围2~1000*/ {

for(t=0,k=1000;k>=10;t++) /*截取整数i的各位(从高向低位)*/ {

a[t]=(i%k)/(k/10); /*分别赋于a[0]~a[2}*/ k/=10; }

if(a[0]*a[0]*a[0]+a[1]*a[1]*a[1]+a[2]*a[2]*a[2]==i) /*判断i是否为阿姆斯特朗数*/

printf(\若满足条件,则输出*/ }

printf(\}

*运行结果

There are following Armstrong number smaller than 1000: 153 370 371 407 25.完全数

如果一个数恰好等于它的因子之和,则称该数为―完全数‖。 *问题分析与算法设计

根据完全数的定义,先计算所选取的整数a(a的取值1~1000)的因子,将各因子累加于m,若m等于a,则可确认a为完全数。 *程序说明与注释 #include int main() {

int a,i,m;

printf(\

for(a=1;a<1000;a++) /*循环控制选取1~1000中的各数进行判断*/ {

for(m=0,i=1;i<=a/2;i++) /*计算a的因子,并将各因子之和m=a,则a是完全数输出*/ if(!(a%i))m+=i; if(m==a) printf(\}

printf(\}

*运行结果

TThere are following perfect numbers smaller than 1000: 6 28 496

26.亲密数

如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。求3000以内的全部亲密数。 *问题分析与算法设计

按照亲密数定义,要判断数a是否有亲密数,只要计算出a的全部因子的累加和为b,再计算b的全部因子的累加和为n,若n等于a则可判定a和b是亲密数。计算数a的各因子的算法: 用a依次对i(i=1~a/2)进行模运算,若模运算结果等于0,则i为a的一个因子;否则i就不是a的因子。 *程序说明与注释 #include int main() {

int a,i,b,n;

printf(\–numbers pair smaller than 3000:\\n\for(a=1;a<3000;a++) /*穷举1000以内的全部整数*/ {

for(b=0,i=1;i<=a/2;i++) /*计算数a的各因子,各因子之和存放于b*/ if(!(a%i))b+=i; /*计算b的各因子,各因子之和存于n*/ for(n=0,i=1;i<=b/2;i++) if(!(b%i))n+=i; if(n==a&&a

printf(\若n=a,则a和b是一对亲密数,输出*/ } }

*运行结果

There are following friendly–numbers pair smaller than 3000: 220.. 284 1184.. 1210 2620.. 2924

27.自守数

自守数是指一个数的平方的尾数等于该数自身的自然数。例如: 252=625 762=5776 93762=87909376 请求出200000以内的自守数 *问题分析与算法设计

若采用―求出一个数的平方后再截取最后相应位数‖的方法显然是不可取的,因为计算机无法表示过大的整数。

分析手工方式下整数平方(乘法)的计算过程,以376为例: 376 被乘数 X 376 乘数 ———-

2256 第一个部分积=被乘数*乘数的倒数第一位 2632 第二个部分积=被乘数*乘数的倒数第二位 1128 第三个部分积=被乘数*乘数的倒数第三位 ———- 141376 积

本问题所关心的是积的最后三位。分析产生积的后三位的过程,可以看出,在每一次的部分积中,并不是它的每一位都会对积的后三位产生影响。总结规律可以得到:在三位数乘法中,对积的后三位产生影响的部分积分别为:

第一个部分积中:被乘数最后三位*乘数的倒数第一位 第二个部分积中:被乘数最后二位*乘数的倒数第二位 第三个部分积中:被乘数最后一位*乘数的倒数第三位

将以上的部分积的后三位求和后截取后三位就是三位数乘积的后三位。这样的规律可以推广到同样问题的不同位数乘积。

按照手工计算的过程可以设计算法编写程序。 *程序说明与注释 #include int main() {

long mul,number,k,ll,kk;

printf(\for(number=0;number<200000;number++) {

for(mul=number,k=1;(mul/=10)>0;k*=10); /*由number的位数确定截取数字进行乘法时的系数k*/ kk=k*10; /*kk为截取部分积时的系数*/ mul=0; /*积的最后n位*/

ll=10; /*ll为截取乘数相应位时的系数*/ while(k>0) {

mul=(mul+(number%(k*10))*(number%ll-number%(ll/10)))%kk; /*(部分积+截取被乘数的后N位*截取乘数的第M位),%kk再截取部分积*/ k/=10; /*k为截取被乘数时的系数*/

ll*=10; }

if(number==mul) /*判断若为自守数则输出*/ printf(\} }

*运行结果

It exsts following automorphic numbners smaller than 200000: 0 1 5 6 25 76 376 625 9376 90625 109376 28.回文数

打印所有不超过n(取n<256) 的其平方具有对称性质的数(也称回文数)。 *问题分析与算法设计

对于要判断的数n,计算出其平方后(存于a),将a的每一位进行分解,再按a的从低到高的顺序将其恢复成一个数k(如n=13,则a=169且k=961),若a等于k则可判定n为回亠数。 *程序说明与注释

原程序好像有错,而且比较费解,现基于原程序修改如下(如果读者还发现错误请提出): #include int main(void) {

int m[16],n,i,t,count=0; long unsigned a,k;

printf(\for(n=1;n<256;n++) /*穷举n的取值范围*/ {

k=0;t=1;a=n*n; /*计算n的平方*/

for(i=0;a!=0;i++) /*从低到高分解数a的每一位存于数组m[0]~m[16]*/ {

m[i]=a;//这个是取得a的个位,整个循环合起来就可以取得各个位 a/=10; } int j=0;

for(i–;j=i)printf(\} return 0; }


C语言100例,C++100例 经典、实用、趣味程序设计编程百例精解(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:袁晓范教学设计4月19—23日平行四边形的性质 - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: