//题目19:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<math.h> //分析:首先必须求出该数所有的因子 //方法1(不推荐) void maina(){ int arr[1000][30] = {0}; int arr2[1000] = { 0 }; int index = 0; int index2 = 0; int temp = 0; int temp2 = 0; for (int j = 3; j < 1000; j++) { temp = 0; temp2 = 0; index = 0; //计算出该数所有的因数 for (int i = 1; i < j; i++) { if (j%i == 0) { arr[j][index] = i; index++; } } if (arr[j][1] != 0) { while (arr[j][temp] != 0){ temp2 += arr[j][temp]; temp++; } if (temp2 == j) { arr2[index2] = j; index2++; } } } for (int k = 0; k < index2; k++) { printf(" %d", arr2[k]); } system("pause"); } //方法2 void main(){ //int k[50] = { 0 }; int s=0,n=0; for (int i = 1; i < 1000; i++) { s = i; n = 0; for (int j = 1; j < i; j++) { if (i%j==0) { //用这个数不断的减去因子 s = s - j; } } //证明是完数 if (s==0) { printf(" 完数是%d",i); } } system("pause"); }
//题目20:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 //第10次落地时,共经过多少米?第10次反弹多高? #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<math.h> //分析:1--100,2--50,3--25,4--12.5...,就是每次的高度是上次的1/2,即f(n)=0.5*f(n-1); //这种由前面的值决定后面值的办法,可以使用递归 //第一次落地,经过100米,第二次经过f(1)+f(2) //第十次落地就是前9次相加之和 double run(int n){ if (n==1) { return 100.0; } else{ return 0.5*run(n - 1); } } void main(){ int n = 10; double sun = 0.0; for (int i = 0; i <10; i++) { if (i==0) { //第一次只有上没有下,所以经过的是100米 sun = 100.0; } else{ //第二次会先跳上去,再跳下来 sun += 2*run(i + 1); } } printf("第10次落地时,共经过%lf米,第10次反弹%lf米",sun,run(11)); system("pause"); }
//题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 //第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下 //的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<math.h> //分析:该题也是前一天,后一天的问题,可以考虑使用递归 //第一天剩下的桃子为f(1);那么第二天剩下的桃子数目就是f(2)=f(1)*0.5-1,即f(1)=2*(f(2)+1);第三天f(2)=2*(f(3)+1); //由此可知:f(9)=2*(f(10)+1); int run(int n){ if (n==10) { return 1; } else{ return 2 * (run(n+1) + 1); } } void main(){ printf("第一天共摘了%d桃子 ", run(1)); system("pause"); }