c程序设计答案贾宗璞许合利

上传人:tian****1990 文档编号:72960296 上传时间:2019-01-24 格式:PPT 页数:48 大小:279.81KB
返回 下载 相关 举报
c程序设计答案贾宗璞许合利_第1页
第1页 / 共48页
c程序设计答案贾宗璞许合利_第2页
第2页 / 共48页
c程序设计答案贾宗璞许合利_第3页
第3页 / 共48页
c程序设计答案贾宗璞许合利_第4页
第4页 / 共48页
c程序设计答案贾宗璞许合利_第5页
第5页 / 共48页
点击查看更多>>
资源描述

《c程序设计答案贾宗璞许合利》由会员分享,可在线阅读,更多相关《c程序设计答案贾宗璞许合利(48页珍藏版)》请在金锄头文库上搜索。

1、简单题,一个奇异的三位数,一个自然数的七进制表达式是一个三位数,而这个自然数的九进制表示也是一个三位数,且这两个三位数的数码正好相反,求这个三位数。,一个奇异的三位数,*问题分析与算法设计 根据题意可知,七进制和九进制表示的这全自然数的每一位一定小于7,可设其七进制数形式为kji(i、j、k的取值分别为16),然后设其九进制表示形式为ijk。,一个奇异的三位数,*程序说明与注释 #include int main() int i,j,k; for(i=1;i7;i+) for(j=0;j7;j+) for(k=1;k7;k+) if(i*9*9+j*9+k=i+j*7+k*7*7) print

2、f(“The special number with 3 digits is:“); printf(“%d%d%d(7)=%d%d%d(9)=%d(10)n“,k,j,i,i,j,k,i*9*9+j*9+k); *运行结果 The special number with 3 digits is:503(7)=305(9)=248(10),8除不尽的自然数,一个自然数被8除余1,所得的商被8除也余1,再将第二次的商被8除后余7,最后得到一个商为a。又知这个自然数被17除余4,所得的商被17除余15,最后得到一个商是a的2倍。求这个自然数。,8除不尽的自然数,问题分析与算法设计 根据题意,可设最后

3、的商为i(i从0开始取值),用逆推法可以列出关系式: (i*8+7)*8)+1)*8+1=(2*i*17)+15)*17+4 再用试探法求出商i的值。,8除不尽的自然数,*程序说明与注释 #include int main() int i; for(i=0;i+) /*试探商的值*/ if(i*8+7)*8+1)*8+1=(34*i+15)*17+4) /*逆推判断所取得的当前i值是否满足关系式*/ /*若满足则输出结果*/ printf(“The required number is: %dn“,(34*i+15)*17+4); break; /*退出循环*/ *运行结果 The requi

4、red number is:1993,有限5位数,个位数为6且能被3整除的五位数共有多少?,有限5位数,*题目分析与算法设计 根据题意可知,满足条件的五位数的选择范围是10006、10016。99996。可设基础数i=1000,通过计算i*10+6即可得到欲选的数(i的变化范围是10009999),再判断该数能否被3整除。,有限5位数,*程序说明与注释 #include int main() long int i; int count=0; /*count:统计满足条件的五位数的个数*/ for(i=1000;i9999;i+) if(!(i*10+6)%3) /*判断所选的数能否被3整除*/

5、 count+; /*若满足条件则计数*/ printf(“count=%dn“,count); *运行结果 count=2999,阶乘尾数零的个数,100!的尾数有多少个零?,阶乘尾数零的个数,问题分析与算法设计 可以设想:先求出100!的值,然后数一下末尾有多少个零。事实上,由于计算机所能表示的整数范围有限,这是不可能的。 为了解决这个问题,必须首先从数学上分析在100!结果值的末尾产生零的条件。 一个整数N若含有一个因子5,则必然会在求N!时产生一个零。因此问题转化为求1到100这100个整数中包含了多少个因子5。若整数N能被25整除,则N包含2个因子5;若整数N能被5整除,则N包含1个

6、因子5。,阶乘尾数零的个数,*程序说明与注释 #include int main() int a,count =0; for(a=5;a=100;a+=5) /循环从5开始,以5的倍数为步长,考察整数 +count; /若为5的倍数,计数器加1 if(!(a%25) +count; /若为25的倍数,计数器再加1 printf(“The number of 0 in the end of 100! is: %d.n“,count); /打印结果 return 0; *运行结果 The number of 0 in the end of 100! is: 24.,阶乘尾数零的个数,*思考题 修改

7、程序中求因子5的数目的算法,使程序可以求出任意N!的末尾有多少个零。,4位反序数,设N是一个四位数,它的9倍恰好是其反序数,求N。反序数就是将整数的数字倒过来形成的整数。例如:1234的反序数是4321。,4位反序数,*问题分析与算法设计 可设整数N的千、百、十、个位为i、j、k、l,其取值均为09,则满足关系式: (i*103+j*102+10*k+l)*9=(l*103+k*102+10*j+i) 的i、j、k、l即构成N。,4位反序数,*程序说明与注释 #include int main() int i; for(i=1002;i1111;i+) /*穷举四位数可能的值*/ if(i%1

8、0*1000+i/10%10*100+i/100%10*10+i/1000=i*9) /*判断反序数是否是原整数的9倍*/ printf(“The number satisfied stats condition is: %dn“,i); /*若是则输出*/ *运行结果 The number satisfied states condition is:1089,高次方数的尾数,求13的13次方的最后三位数 。,高次方数的尾数,*问题分析与算法设计 解本题最直接的方法是:将13累乘13次方截取最后三位即可。 但是由于计算机所能表示的整数范围有限,用这种“正确”的算法不可能得到正确的结果。事实上,

9、题目仅要求最后三位的值,完全没有必要求13的13次方的完整结果。 研究乘法的规律发现:乘积的最后三位的值只与乘数和被乘数的后三位有关,与乘数和被乘数的高位无关。利用这一规律,可以大大简化程序。,高次方数的尾数,*程序说明与注释 #include int main() int i,x,y,last=1; /*变量last保存求X的Y次方过程中的部分乘积的后三位*/ printf(“Input X and Y(X*Y):“); scanf(“%d*%d“, /*打印结果*/ *运行结果 Input X and Y(X*Y):13*13 The last 3 digits of 13*13 is:2

10、53 Input X and Y(X*Y):13*20 The last 3 digits of 13*20 is:801,求车速,一辆以固定速度行驶的汽车,司机在上午10点看到里程表上的读数是一个对称数(即这个数从左向右读和从右向左读是完全一样的),为95859。两小时后里程表上出现了一个新的对称数。问该车的速度是多少?新的对称数是多少?,求车速,*问题分析与算法设计 根据题意,设所求对称数为i,其初值为95589,对其依次递增取值,将i值的每一位分解后与其对称位置上的数进行比较,若每个对称位置上的数皆相等,则可判定i即为所求的对称数。,求车速,*程序说明与注释 #include int m

11、ain() int t,a5; /*数组a存放分解的数字位*/ long int k,i; for(i=95860;i+) /*以95860为初值,循环试探*/ for(t=0,k=100000;k=10;t+) /*从高到低分解所取i值的每位数*/ /* 字,依次存放于a0a5中*/ at=(i%k)/(k/10); k/=10; if(a0=a4) ,求车速,*运行结果 The new symmetrical number kelometers is:95959. The velocity of the car is:50.00 *思考题 将一个数的数码倒过来所得到的新数叫原数的反序数。如

12、果一个数等于它的反序数,则称它为对称数。求不超过1993的最大的二进制的对称数。,可逆素数,求四位的可逆素数。可逆素数指:一个素数将其各位数字的顺序倒过来构成的反序数也是素数。,可逆素数,*问题分析与算法设计 本题的重点不是判断素数的方法,而是求一个整数的反序数。求反序数的方法是从整数的末尾依次截取最后一位数字,每截取一次后整数缩小10倍,将截取的数字作为新的整数的最后一位(新的整数扩大10倍后加上被截取的数字)。这样原来的整数的数字从低到高被不断地截取,依次作为新的整数从高到低的各位数字。,可逆素数,*程序说明与注释 #include #include int num(int number)

13、; int ok(int number); int main() int i,count; printf(“There are invertable primes with 4 digits: n“); for(count=0,i=1001;i9999;i+=2) /穷举全部的奇数 if(num(i) /若是可逆素数,则输出 printf(count%9 ? “%3d:%d“ : “%3d:%dn“,+count,i); return 0; ,int num(int number) int i,j; if(!ok(number)return 0; /判断是否为素数 for(i=number,j

14、=0;i0;i/=10) /按位将整数倒过来,产生反序数 j=j*10 + i%10; if(numberj) /若原数小于反序数 if(!ok(i) /判断对应的反序数是否为可逆素数 return 0; else return 1; /若是可逆数素数,则返回1 else return 0; getchar(); return 0; ,可逆素数,int ok(int number) int i,j; if(number%2 =0) /判断是否为素数 return 0; j= sqrt(double)number) +1 ; /取整数的平方根为判断的上限 for(i=3;ij;i+=2) if(

15、number %i =0) /若为素数则返回1,否则返回0 return 0; return 1; ,*思考题 求1000以内的孪生素数。孪生素数是指:若a为素数,且a+2也是素数,则素数a和a+2称为孪生素数。,回文素数,求不超过1000的回文素数。 所谓回文素数是指,对一个整数n从左向右和从由向左读其结果值相同且是素数,即称n为回文素数。,回文素数,*问题分析与算法设计 本题的重点不是判断素数的方法,而是求回文整数。构造回文数的方法很多,这里仅介绍一种最简单的算法。实现思路是先求出一个整数的回文数,再判断是否为素数。 不超过1000的回文数包括二位和三位的回文数,我们采用穷举法来构造一个整数并求与其对应的反序数,若整数与其反序数相等,则该整数是回文数。,回文素数,*程序说明与注释 #include int a(int n) int main() int i,j,t,k,s; printf(“Following are palindrome primes not greater than 1000:n”); for(i=0;i10|t10) ,/判断参数n是否为素数 int a(int n) int i; for(i=2;i(n-1)/2;+=i) if(n%i = 0) return 0; return 1; *运行结果 Following are palindrome

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号