特殊数据的输出【涉及知识点】1.函数的参数;2.多分支条件语句;3.循环;4.数据的输入输出;5.随机函数的使用。
【题目介绍】请编写程序,由系统随机产生一个正整数n(1<n<50000),根据菜单提示,选择输出小于n 的以下7种特殊数据中的一种:(1)完全数,(2)亲密数,(3)水仙花数,(4)阶乘和数,(5)自守数,(6)孪生素数;直到用户退出系统。
【功能要求】1.采用1行输出5个数据的格式。
2.主函数实现正整数n的随机产生和菜单的显示,如图3.1所示。
数据n作为函数的实参传递给各个子函数。
3.子函数实现1到n之间的特殊数据的判断和输出,不同类型特殊数据的判断用不同子函数实现。
【难点与提示】1.各类特殊数据的解释如下:(1)完全数是恰好等于自身的因子之和的数,例如6是完全数,因为6=1*2*3=1+2+3。
(2)亲密数是两个正整数,其中一个整数的全部因子之和等于另一个(因子中不计本身),例如220和284是亲密数,因为220的全部因子是1,2,4,5,10,11,20,22,44,55,110,和为284;而284的全部因子是1,2,4,71,142,和为220。
(3)水仙花数是恰好等于自身各位数字立方和的数,例如153是水仙花数,因为153=13+53+33。
(4)阶乘和数是恰好等于自身各位数字阶乘的和的数,例如145是阶乘和数,因为145=1!+4!+5!。
(5)自守数是平方后尾部数字是自身的数,例如9376是,因为93762=87909376。
(6)孪生素数是差2的两个素数,例如197和199。
2.建议编写一个函数求出某数的因子和,以减少求完全数和亲密数函数中的重复代码。
3.自守数中整数x尾部数字的求法:x%10表示x的最后一位数字,x%100表示x的最后两位数字,x%1000表示x的最后三位数字,以此类推。
4.C编译器提供了基于ANSI标准的伪随机数发生器函数rand()和srand(),用来生成随机数。
这二个函数的工作过程如下:srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间);根据需要多次调用rand(),从而不间断地得到新的随机数;无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。
例1是0~32767之间的随机数程序:例1:#include<stdlib.h>#include<stdio.h>#include<time.h>//使用当前时钟做种子void main(void){int i;srand((unsigned)time(NULL));//初始化随机数for(i=0;i<10;i++)//打印出10个随机数printf("%d\n",rand());}参照上述程序随机生成正整数n(1<n<50000)。
程序源代码:#include<stdio.h>#include<stdlib.h>#include<time.h>//以下函数求一个整数的所有因子的和。
int yinzihe(int n){int i,r=0;for(i=1;i<=n/2;i++)if(n%i==0)r+=i;return r;}//以上函数求一个整数的所有因子的和。
void wqs(int n)//输出完全数{int i,k=0;for(i=1;i<n;i++){if(yinzihe(i)==i){printf("%d",i);k++;if(k%5==0)printf("\n");}}printf("\n");}void qms(int n)//输出亲密数{int i,k=0;for(i=2;i<n;i++){if(i==yinzihe(yinzihe(i))){printf("[%d,%d]",i,yinzihe(i));k++;if(k%5==0)printf("\n");}}printf("\n");}//以下输出水仙花数int ggsh(int i)//求个个位上的数字的三次方的和。
{int a,t=0;while(i!=0){a=i%10;t+=a*a*a;i=i/10;}return t;}void sxhs(int n)//输出水仙花数{int i,k=0,a=0,t=0;for(i=100;i<n;i++){t=ggsh(i);if(i==t){printf("%d",t);k++;if(k%5==0)printf("\n");}}printf("\n");}//以上输出水仙花数//以下输出阶乘和数int jc(int i)//求阶乘{int t=1;for(int j=1;j<=i;j++)t*=j;return t;}int jch(int i)//求个个位上数值的阶乘和{int a=0,t=0;while(i!=0){a=jc(i%10);t+=a;i=i/10;}return t;}void jchs(int n)//输出阶乘和数{int i,k=0,a=0,t=0;for(i=1;i<n;i++){t=jch(i);if(i==t){printf("%d",t);k++;if(k%5==0)printf("\n");}}printf("\n");}//以上输出阶乘和数int A(int i){int j=0;return i;}//一下输出自守数int mm(int i)//求i的位数(若i=1234,则返回1000){int j=1;while(j<=i)j*=10;return j;}void zss(int n)//输出自守数{int i,k=0,t;for(i=1;i<=n;i++){if((i*i)%mm(i)==i){printf("%d",i);k++;if(k%5==0)printf("\n");}}printf("\n");}//以上输出自守数void lsss(int n)//输出孪生素数{int s,k,m=0;for(int i=1;i+2<=n;i++){s=1;k=i/2;/*先假设i是素数*/for(int j=2;j<=k;j++){if(i%j==0){s=0;/*i不是素数*/break;}}if(s!=0){k=(i+2)/2;for(int j=2;j<=k;j++){if((i+2)%j==0){s=0;/*i+2不是素数*/break;}}if(s!=0){printf("[%d,%d]",i,i+2);m++;if(m%5==0)printf("\n");}}}printf("\n");}void main(){int n,i;srand((unsigned)time(NULL));n=rand();printf("请输入n:%d\n",n);printf("******************************************\n");printf(" 1.输出完全数\n");printf(" 2.输出亲秘数\n");printf(" 3.输出水仙花数\n");printf(" 4.输出阶乘数\n");printf(" 5.输出自守数\n");printf(" 6.输出孪生素数\n");printf("0.退出\n");printf("******************************************\n");printf("请输入选择:");scanf("%d",&i);while(i!=0){switch(i){case(1):printf("完全数:\n");wqs(n);break;case(2):printf("亲密数:\n");qms(n);break;case(3):printf("水仙花数:\n");sxhs(n);break;case(4):printf("阶乘和数:\n");jchs(n);break;case(5):printf("自守数:\n");zss(n);break;case(6):printf("孪生素数:\n");lsss(n);break;case(0):printf("\n");break;default:printf("输入错误!\n");break;}printf("请输入选择:");scanf("%d",&i);}}运行结果:。