博文
[041] 练习循环打印*图案(2006-03-19 16:29:00)
摘要:<谭> 6.14打印出以下图案: * *** ************ ***** *** *#include <stdio.h>int main(){ int i, j, k; for (i = 1; i <= 4; i++) { for (j = 1; j <= 4 - i; j++) printf(" "); for (k = 1; k <= 2 * i - 1; k++) printf("*"); printf("\n"); } for (i = 1; i <= 3; i++) { for (j = 1; j <= i; j++) printf(" "); for (k = 1; k <= 7 - 2 *i; k++) printf("*"); &......
[040] 迭代法求平方根(2006-03-19 14:01:00)
摘要:<谭> 6.11
用迭代法求某数a的平方根。已知求平方根的迭代公式为:x n+1 = (xn + a / xn) / 2要求前后两次求出的差的绝对值小于10-5。算法如下:① 设定一个x的初值x0 ; (在如下程序中取x0=a/2, 通过迭代公式求出x1,可以肯定与真正的平方根相比,误差很大。)② 用上述公式求出x的下一个值 x1 ;③ 如此继续下去,直到前后两次求出的x值(x n+1和xn)满足以下关系:|x n+1-xn|<10-5 . #include <stdio.h>#include <math.h>int main(){ float a; /* 被开方数 */ float x0, x1; /* 分别代表前一项和后一项 */ printf("Input a positive number:\n"); scanf("%f", &a); x0 = a / 2; /* 任取初值 */ x1 = (x0 + a / x0) / 2; while (fabs(x1 - x0) >= 1e-5) { x0 = x1; x1 = (x0 + a / x0) / 2; } printf("The square root of %5.2f is %8.5f\n", a, x1); return 0;}运行结果:=====================================Input a positive number:2↙The square r......
[039] 猴子吃桃问题(2006-03-19 12:37:00)
摘要:<谭> 6.10
猴子第一天摘下若干桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。#include <stdio.h>int main(){ int prev ; /* 前一天 */ int next = 1 ; /* 后一天, 初值为第10天 */ int i; for (i = 9; i >= 1; i--) { prev = (next + 1) * 2 ; /* next=prev-(prev/2+1) */ next = prev; } printf("total=%d\n", prev); return 0;}
运行结果:====================total=1534====================
★ 此题用倒推的办法,所以注意循环结束的条件。多数情况下用循环为递增方式,本题中用递减方式,因此是: i >= 1 。
分步验证如下:#include <stdio.h>int main(){ int prev ; int next = 1 ; int i; for (i = 9; i >= 1; i--) { prev =......
[038] 小球反弹(2006-03-18 23:28:00)
摘要:<谭> 6.9
一球从100m高度自由落下,每次落地后反跳回原高度的一半再落下。求它在第10次落地时共经过多少m? 第10次反弹多高?#include <stdio.h>int main(){ float an = 100 ; /* 第一次落地前的高度 */ float sn = an ; /* 第一次落地时总路程 */ int i ; for ( i = 2; i <= 10; i++) { an = an / 2 ; sn = sn + an * 2 ; } printf("Sum=%fm\n",sn); printf("The tenth hight is: %fm\n",an / 2); return 0;}运行结果:======================================Sum=299.609375mThe tenth hight is: 0.097656m======================================★ 如此设计时绕了个小弯儿, 即第10次落地时的an为第9次反弹的高度, 因此在输出时又一次减半为an/2, 验证如下:#include <stdio.h>int main(){ float an = 100 ; float sn = an&......
[037] 2/1,3/2,5/3,8/5,13/8,21/13,……(2006-03-12 23:15:00)
摘要:<谭> 6.8
有一分数序列: 2/1,3/2,5/3,8/5,13/8,21/13,…… 求出这个数列的前20项之和。#include <stdio.h>int main(){ int i, cup, n = 20; float a = 2, b = 1, s = 0; for (i = 1; i <= n; i++) { s = s + a / b; cup = a; a = a + b; b = cup; } printf("sum=%9.6f\n", s); return 0;}运行结果:============================sum=32.660259============================★ 后项分子为前项分子分母之和, 分母为前项的分子。......
[036] 完数(2006-03-12 22:14:00)
摘要:<谭> 6.7
一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。编程找出1000之内的所有完数,并按下面格式输出其因子:6 Its factors are 1,2,3#include <stdio.h>const int M = 1000; /* 定义寻找范围 */int main(){ int k1, k2, k3, k4, k5, k6, k7, k8, k9, k10; int i, a, n, s; for (a = 2; a <= M; a++) { n = 0; /* n累计因子的个数 */ s = a; /* s存放未求出的因子之和,初值为被测数本身 */ for (i = 1; i < a; i++) if (a % i == 0) /* 由i到a循环检测i是否为a的因子 */ { n++; /* 找到一个因子 */ ......
[035] 水仙花数(2006-03-12 19:46:00)
摘要:<谭> 6.6打印出所有的"水仙花数", 所谓"水仙花数"是指一个3位数,其各位数字立方和等于该数本身。例如, 153就是一水仙花数,因为153 = 13+53+33 。#include <stdio.h>int main(){ int i, j, k; /* 分别表示百位,十位,个位 */ int n; for (n = 100; n < 1000; n++) { i = n / 100; j = n / 10 - i * 10; k = n - i * 100 - j * 10; if (i*i*i + j*j*j + k*k*k == n) printf("%d ", n); } return 0;} 运行结果:======================153 370 371 407 ======================######################################改进########################################经网友指点,查了一下math.h中的pow函数double pow(double a, double b) 即求 a 的 b 次方修改如下:#include <stdio.h>#include <math.h>int main(){ int i, j, k; &n......
[034] 显示各种数据类型的长度(2006-03-12 16:42:00)
摘要:通过 sizeof (数据类型) 操作符可以确定某种数据类型的长度。
#include <stdio.h>int main(){ printf("char : %d byte\n", sizeof(char)); printf("int : %d byte\n", sizeof(int)); printf("float : %d byte\n", sizeof(float)); printf("double : %d byte\n", sizeof(double)); return 0;}TC下结果:=========================char : 1 byteint : 2 bytefloat : 4 bytedouble : 8 byte=========================VC下结果:=========================char : 1 byteint : 4 bytefloat : 4 bytedouble : 8 byte=========================★ 注意TC和VC下的数据类型的长度, 以及16位和32位的一些不同。环境的不同会影响如int这种数据类型的表示范围。......
[033] 阶乘->数据的范围(2006-03-12 16:10:00)
摘要:<谭> P1206.4 求 1!+2!+3!+...+20!#include <stdio.h>int main(){ int t = 1; /* t表示各项值 */ int s = 0; /* s表示各项和 */ int i; for(i = 1; i <= 20; i++) { t = t * i; s = s + t; } printf("1!+2!+3!+...+20!=%d\n", s); return 0;}运行结果:================================1!+2!+3!+...+20!=268040729================================★ 那么这个结果是否正确呢, 首先将各项输出看一下#include <stdio.h>int main(){ int t = 1; /* t表示各项值 */ int s = 0; /* s表示各项和 */ int i; for(i = 1; i <= 20; i++) { t = t * i; s = s + t; printf("%d!=%d\n", i, t); /* 输出各项 */ ......
[032] 计算a+aa+aaa+...(2006-03-12 15:06:00)
摘要:<谭> 6.3 P120
求 Sn=a+aa+aaa+...+aa...a (n个)的值,其中a为一个数字,例如: 2+22+222+2222+22222(此时n=5), n由键盘输入#include <stdio.h>int main(){ int a, n; int tn = 0; /* 第i个a组成的数 */ int sn = 0; /* 前i项多项式之和 */ printf("Enter a, n \n"); scanf("%d %d", &a, &n); for (int i = 1; i <= n; i++) { tn = tn + a; sn = sn + tn; a = a * 10; } printf("a+aa+aaa+...=%d\n", sn); return 0;}运行结果:===================Enter a, n2 5↙a+aa+aaa+...=24690===================......
