第5次作业
1.输入两个正整数m和n(要求m<=n), 求m!+(m+1)!+(m+2)!…+n!
1 #include<stdio.h> 2 int main() 3 { 4 5 int m,n,i,j; 6 float s=1,sum=0; 7 printf("请输入m,n的值:"); 8 scanf("%d,%d",&m,&n); 9 if(m>n) 10 { 11 printf("粗错啦!"); 12 } 13 else if(m<=n) 14 { 15 for(i=m;i<=n;i++) 16 { 17 s=1; 18 for(j=1;j<=i;j++) 19 { 20 s=s*j; 21 } 22 sum=sum+s; 23 } 24 printf("从m到n的阶乘的和为%.f",sum); 25 } 26 27 return 0; 28 }
2.输出1000以内的所有完数。所谓完数是指这个数恰好等于除他本身外的所有因子之和。例,6的因子为1,2,3,6=1+2+3,所以6是完数。
1 #include<stdio.h> 2 int main() 3 { 4 int sum=0,i,j; 5 printf("输出1000内所有完数"); 6 for(i=1;i<=1000;i++) 7 { 8 sum=0; 9 for(j=1;j<i;j++) 10 { 11 if(i%j==0) 12 { 13 sum=sum+j; 14 } 15 } 16 if(i==sum) 17 { 18 printf("\n%d",i); 19 } 20 21 } 22 return 0; 23 } 24
3.奇偶归一猜想——对于每一个正整数,如果它是奇数,则对它乘3再加1,如果它是偶数,则对它除以2,如此循环,最终都能够得到1。 如n = 11,得序列:11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1。(共有14个步骤) 题目输入正整数n,求这个n多少步能归一
1 #include<stdio.h> 2 int main() 3 { 4 int x,a=0,b=0,sum=0; 5 printf("请输入一位正整数:\n",a); 6 scanf("%d",&x); 7 do 8 { 9 if(x>0&&x!=1) 10 { 11 if(x%2==0) 12 { 13 x=x/2; 14 a++; 15 } 16 else if(x%2!=0) 17 { 18 x=3*x+1; 19 b++; 20 } 21 } 22 }while(x!=1); 23 sum=a+b; 24 printf("数字x一共经过了%d次运算",sum); 25 return 0; 26 } 27
附加题:
1.输入一个正整数n,输出2/1+3/2+5/3+8/5+…的前n项之和,保留2位小数,该序列从第二项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。
1 #include<stdio.h> 2 int main() 3 { 4 int n,i; 5 float sum,a,b,c; 6 printf("输入一个整数n:\n",n); 7 scanf("%d",&n); 8 if(n<=0) 9 { 10 printf("error"); 11 } 12 a=2; 13 b=1; 14 sum=0; 15 for(i=1;i<=n;i++) 16 { 17 sum=sum+a/b; 18 c=a+b; 19 b=a; 20 a=c; 21 } 22 printf("%.2f",sum); 23 return 0; 24 }
2.凯撒密码(caeser)的原理:每一个字母按字母表顺序向后移3位,如a加密后变成d,b加密后变成e,……x加密后变成a,y加密后变成b,z加密后变成c。例如:“baidu”用凯撒密码法加密后字符串变为“edlgx”。试写一个算法,将键盘输入的文本字符串(只包含a~z的字符)进行加密后输出。
1 #include<stdio.h> 2 int main() 3 { 4 char x; 5 printf("请输入一个字母"); 6 scanf("%c",&x); 7 while(x!='\n') 8 { 9 if('x'>='a'&&x<='w') 10 { 11 x=x+3; 12 } 13 else if(x=='x'||x=='y'||x=='z') 14 { 15 x=x-23; 16 } 17 else if(x>='A'&&x<='W') 18 { 19 x=x+3; 20 } 21 else if(x=='X'||x=='Y'||x=='Z') 22 { 23 x=x-23; 24 } 25 if(x=='\n') 26 { 27 break; 28 } 29 printf("%c\n",x); 30 scanf("%c",&x); 31 } 32 return 0; 33 }
二、实验总结(实验中遇到的问题及解决方法)
1:第一题就想课堂讲的一样里面的循环累乘,外面累加,这样就可以完成从一个数到另一个数的阶乘的和。注意里循环从1开始,外循环从输入较小的书开始。
2:再给累加的符号求和时要记住赋值,而且要在循环的里面。
3:先注意前提条件正整数,所以输出判断数字大于0,并且最后求出两个分式运行次数的和。
附加题:
1:在进行除法运算是最新的数等于前两个数之和,但是当较小的数被复制给较大的数,较大的数就已经被赋值,所以需要第三个数进行被赋值的程序,由于保留两位小数,所以最后要加%.2f或者%.2d来完成保留两位小数。
2:因为x,y,z三个数不像其他的字母加三,所以需要特殊处理减去23,并且程序运算的前提条件是字母,所以需要给出限制条件,当在是字母的情况下才能输出。