参考答案: 1.#include<stdio.h> #include<stdlib.h> int main() { int n; puts("input n: "); scanf("%d", &n); puts("过程:"); printf("%d -> ", n); while (n != 1) { if (0 == (n&1)) n = n / 2; //迭代关系式 else n = n * 3 + 1; //迭代关系式 printf("%d -> ", n); } printf("\b\b\b\b \n");//去掉多余的“ -> ” system("pause"); return 0; } 2. 算法分析: 根据题意,阿米巴每3分钟分裂一次,那么从开始的时候将阿米巴放入容器里面,到45分钟后充满容器,需要分裂 45/3=15 次。而"容器最多可以装阿米巴2^20个", 即阿米巴分裂15次以后得到的个数是2^20 。题目要求我们计算分裂之前的阿米巴数,不妨使用倒推的方法,从第15次分裂之后的2^20个,倒推出第15次分裂之前(即第14次分裂之后)的个数,再进一步倒推出第13次分裂之后、第12次分裂之后、……第1次分裂之前的个数。设第1次分裂之前的个数为x0 、第1次分裂之后的个数为x1 、第2次分裂之后的个数为x2 、…… 第15次分裂之后的个数为x(15),则有x(14)=x(15)/2,x(13)=x(14)/2,……x(n-1)=x(n)/2 (n >= 1) 因为第15次分裂之后的个数x(15)是已知的,如果定义迭代变量为x ,则可以将上面的倒推公式转换成如下的迭代公式: x=x/2 (x的初值为第15次分裂之后的个数2^20)让这个迭代公式重复执行15次,就可以倒推出第1次分裂之前的阿米巴个数。因为所需的迭代次数是个确定的值,我们可以使用一个固定次数的循环来实现对迭代过程的控制。 #include<stdio.h> #include<math.h> int main() { int max = pow(2, 20); int n = 15; int i; int s = max; for (i=1; i<=n; i++) { s /= 2; } printf("开始的时候往容器内放了%d个阿米巴\n", s); getchar(); return 0; } 3. 算法分析:先要找一下第N只猴子和其面前桃子数的关系。如果从第1只开始往第5只找,不好找,但如果思路一变,从第N到第1去,可得出下面的推导式: 第N只猴 第N只猴前桃子数目 6 s6=x, 即最后剩下的桃子数 5 s5=s6*5/4+1 4 s4=s5*5/4+1 3 s3=s4*5/4+1 2 s2=s3*5/4+1 1 s1=s2*5/4+1, 即最初的桃子数 s1即为所求。上面的规律中只要将s1-s5的下标去掉: s=x s=s*5/4+1 s=s*5/4+1 s=s*5/4+1 s=s*5/4+1 s=s*5/4+1 很显然,这是一种迭代,所以可以用循环语句加以解决。 综观程序的整体结构,最外是一个循环,因为循环次数不定,可以使用While循环,其结束条件则是找到第一个符合条件的数。为了做出上面while循环的结束条件,还需进一步分析上述规律的特点,要符合题目中的要求,s2-s6五个数必须全部能被4整除,而s1不能被4整除,这个可作为条件。具体实现请参看源程序。 #include <stdio.h> int main(void) { int x, s; int i; for(x=0; ;x+=4) { s = x; for (i=0; i<5; i++) { s = s * 5 / 4 + 1; if (s % 4) break; } if (i == 4) break; } printf("摘了%d个桃子, 剩下%d个桃子\n", s, x); getchar(); return 0; } 4. #include<stdio.h> double F1(double x); //要求解的函数 double F2(double x); //要求解的函数的一阶导数函数 double Newton(double x0, double e);//通用Newton迭代子程序 int main() { double x0; double e = 10E-6; x0 = -6; printf("x = %f\n", Newton(x0, e)); x0 = 6; printf("x = %f\n", Newton(x0, e)); getchar(); return 0; } double F1(double x) //要求解的函数 { return x * x - 45; } double F2(double x) //要求解的函数的一阶导数函数 { return 2 * x; } double Newton(double x0, double e)//通用Newton迭代子程序 { double x1; do { x1 = x0; x0 = x1 - F1(x1) / F2(x1); } while (fabs(x0 - x1) > e); return (x0 + x1) * 0.5; }

评论