习题21
猴子吃桃问题:
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个;以后每天早上都吃了前一天剩下的一半零一个。到第 10 天早上想再吃时,见只剩下一个桃子了,求第一天共摘了多少。
实现思路:
采用逆向思维进行反推。
代码如下:
#include<stdio.h> int main(){ int sum = 1, i; for(i = 10; i > 1; i--){ sum += 1; sum *= 2; } printf("Sum = %d\n", sum); return 0; }
打印:
Sum = 1534
习题22
两个乒乓球队进行比赛,各出三人,甲队为 a、b、c 三人,乙队为 x、y、z 三人。已抽签决定比赛名单,有人向队员打听比赛的名单,a 说他不和 x 比, c 说他不和 x、z 比,请编程序找出三对赛手的名单。
实现思路:
多层循环嵌套,遍历并判断。
代码如下:
#include<stdio.h> int main(){ char a, b, c; for(a = 'x'; a <= 'z'; a++){ for(b = 'x'; b <= 'z'; b++){ for(c = 'x'; c <= 'z'; c++){ if(a != b && b!= c && a != c){ if(a != 'x' && c != 'x' && c != 'z'){ printf("a-%c\nb-%c\nc-%c\n", a, b, c); } } } } } return 0; }
打印:
a-z b-x c-y
习题23
打印出如下图案(菱形):
实现思路:
方式一——分成两部分:
先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重for循环,第一层控制行,第二层控制列。
代码如下:
#include<stdio.h> int main(){ int i, j; for(i = 0; i < 4; i++){ for(j = 0; j < 3 - i; j++){ printf(" "); } for(j = 0; j < 2 * i + 1; j++){ printf("*"); } printf("\n"); } for(i = 0; i < 3; i++){ for(j = 0; j <= i; j++){ printf(" "); } for(j = 0; j < 5 - 2 * i; j++){ printf("*"); } printf("\n"); } return 0; }
打印:
* *** ***** ******* ***** *** *
方式二——看成一个整体:
用一个遍历来控制,使之成为一个整体,循环打印。
代码如下:
#include<stdio.h> #include <math.h> int main(){ int i, j; for(i = -3; i < 4; i++){ for(j = 0; j < abs(i); j++){ printf(" "); } for(j = 0; j < 7- 2 * abs(i); j++){ printf("*"); } printf("\n"); } return 0; }
效果与前面相同。
习题24
有一分数序列:2/1、3/2、5/3、8/5、13/8、21/13…
求出这个数列的前20项之和。
显然,这个数列每个元素的分子和分母构成了斐波拉契数列,可循环求和。
代码如下:
#include<stdio.h> int main(){ float sum = 0, f1 = 1, f2 = 1, i, temp; for(i = 0; i < 20; i++){ temp = f2; f2 += f1; f1 = temp; sum += f2 / f1; } printf("Sum = %8.4f\n", sum); return 0; }
打印:
Sum = 32.6603
习题25
求1+2!+3!+…+20!的和。
实现思路:
使用循环求和。
代码如下:
#include<stdio.h> int main(){ float i, t = 1, sum = 0; for(i = 1; i < 21; i++){ t *= i; sum += t; } printf("Sum = %.2f\n", sum); return 0; }
打印:
Sum = 2561327455189073900.00