一、程序控制结构
(一)输出斐波拉契数(二)打印杨辉三角形(三)打印乘法九九表(四)百钱买百鸡问题(五)打印水仙花数
一、程序控制结构 (一)输出斐波拉契数斐波那契数列,又称黄金分割数列,指的是这样一个数列: 1 、 1 、 2 、 3 、 5 、 8 、 13 、 21 、 34 、 … … 1、1、2、3、5、8、13、21、34、…… 1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以递推的方法定义: F ( 0 ) = 1 , F ( 1 ) = 1 , F ( n ) = F ( n − 1 ) + F ( n − 2 ) ( n ≥ 2 , n ∈ N ∗ ) F(0)=1,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*) F(0)=1,F(1)=1,F(n)=F(n−1)+F(n−2)(n≥2,n∈N∗)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从 1963 1963 1963年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。源代码
#include "stdio.h"
int main()
{
int i, a, b, c, f[40];
printf("方法一:利用简单变量进行迭代n");
a = 1;
b = 1;
printf("%-8d %-8d ", a, b);
for (i = 3; i <= 40; i++)
{
c = a + b;
printf("%-8d ", c);
a = b;
b = c;
if (i % 5 == 0)
printf("n");
}
printf("nn方法二:利用一维数组进行递推n");
f[0] = 1;
f[1] = 1;
for (i = 2; i < 40; i++)
{
f[i] = f[i - 1] + f[i - 2];
}
for (i = 0; i < 40; i++)
{
printf("%-8d", f[i]);
if ((i + 1) % 5 == 0)
printf("n");
}
return 0;
}
运行结果
(二)打印杨辉三角形
杨辉三角,是二项式系数在三角形中的一种几何排列,中国南宋数学家杨辉1261年所著的《详解九章算法》一书中出现。在欧洲,帕斯卡(1623 ~ 1662)在1654年发现这一规律,所以这个表又叫做帕斯卡三角形。帕斯卡的发现比杨辉要迟393年,比贾宪迟600年。
( a + b ) 1 = a + b (a+b)^1=a+b (a+b)1=a+b
( a + b ) 2 = a 2 + 2 a b + b 2 (a+b)^2=a^2+2ab+b^2 (a+b)2=a2+2ab+b2
( a + b ) 3 = a 3 + 3 a 2 b + 3 a b 2 + b 3 (a+b)^3=a^3+3a^2b+3ab^2+b^3 (a+b)3=a3+3a2b+3ab2+b3
(
a
+
b
)
4
=
a
4
+
4
a
3
b
+
6
a
2
b
2
+
4
a
b
3
+
b
4
(a+b)^4=a^4+4a^3b+6a^2b^2+4ab^3+b^4
(a+b)4=a4+4a3b+6a2b2+4ab3+b4
……
源代码
#include "stdio.h"
int main()
{
int i, j, k, m[14][14];
for (i = 0; i < 14; i++)
{
for (j = 0; j < 15; j++)
{
m[i][j] = 1;
}
}
for (i = 2; i < 14; i++)
{
for (j = 1; j < i; j++)
{
m[i][j] = m[i - 1][j - 1] + m[i - 1][j];
}
}
for (i = 0; i < 14; i++)
{
for (k = 1; k < 40 - 3 * i; k++)
{
printf(" ");
}
for (j = 0; j <= i; j++)
{
printf("%-5d ", m[i][j]);
}
printf("n");
}
return 0;
}
运行结果
(三)打印乘法九九表
作为启蒙教材,我们都背过九九乘法表:一一得一、一二得二、……、九九八十一。而古代是从“九九八十一”开始,因此称“九九表”。九九表的使用,对于完成乘法是大有帮助的。齐桓公纳贤的故事说明,到公元前7世纪时,九九歌诀已不稀罕。也许有人认为这种成绩不值一提。但在古代埃及作乘法却要用倍乘的方式呢。举个例子说明:比如计算23×13,就需要从23开始,加倍得到23×2,23×4,23×8,然后注意到13=1+4+8,于是23+23×4+23×8加起来的结果就是23×13。通过对比,不难看出使用九九表的优越性了。源代码
#includeint main() { int i, j; for (i = 1; i <= 9; i++) { for (j = 1; j <= i; j++) { printf("%d×%d=%-2d ", i, j, i * j); } printf("n"); } }
运行结果
(四)百钱买百鸡问题
我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?
翻译过来,意思是公鸡一个五块钱,母鸡一个三块钱,小鸡三个一块钱,现在要用一百块钱买一百只鸡,问公鸡、母鸡、小鸡各多少只?
需要定义三个整型变量
c
o
c
k
cock
cock,
h
e
n
hen
hen,
c
h
i
c
k
chick
chick,分别代表公鸡、母鸡和小鸡的购买数量。
有两方面的条件:关于钱的条件与关于鸡的条件
– 钱的条件:
c
o
c
k
×
5
+
h
e
n
×
3
+
c
h
i
c
k
3
=
100
cock times5+hentimes3+displaystylefrac{chick}{3}=100
cock×5+hen×3+3chick=100
– 鸡的条件:
c
o
c
k
+
h
e
n
+
c
h
i
c
k
=
100
cock+hen+chick=100
cock+hen+chick=100
源代码
#include "stdio.h"
int main()
{
int cock, hen, chick, count = 0;
for (cock = 0; cock <= 20; cock++)
{
for (hen = 0; hen <= 34; hen++)
{
for (chick = 0; chick <= 100; chick++)
{
if (cock + hen + chick == 100 &&
cock * 5 + hen * 3 + chick / 3.0 == 100)
{
count++;
printf("cock = %-2d, hen = %-2d, chick = %-2d n", cock, hen, chick);
}
}
}
}
printf("百钱买百鸡购买方案数:%dn", count);
}
运行结果
(五)打印水仙花数
所谓水仙花数,是指等于其各位数字立方和的三位数。
qquad
153
=
1
3
+
5
3
+
3
3
153=1^3+5^3+3^3
153=13+53+33
qquad
370
=
3
3
+
7
3
+
0
3
370=3^3+7^3+0^3
370=33+73+03
qquad
371
=
3
3
+
7
3
+
1
3
371=3^3+7^3+1^3
371=33+73+13
qquad
407
=
4
3
+
0
3
+
7
3
407=4^3+0^3+7^3
407=43+03+73
分析问题,首先水仙花数是三位数,那么我们可以确定范围:100~999,这个我们可以通过循环结构来搞定:
for (n = 100; n <= 999; n++) {
...
}
然后对于这个范围的每个数n,我们要去判断它是否等于其各位数字的立方和,这里的难点或关键在于如何分解一个三位数,得到它的每位数字。
假设我们已经把三位数n分解成百位数p3,十位数p2,个位数p1,
这样我们的筛选条件就可以写出来:n == p3 * p3 * p3 + p2 * p2 * p2 + p1 * p1 * p1。
如何拆分一个三位数n呢?
首先求n的个位数:n % 10
然后要将三位数变成两位数:n = n / 10;
对于新的两位数n,又求它的个位数:n % 10
然后要将两位数变成一位数:n = n / 10;
也就是说我们可以交替使用求余和整除运算将一个三位数拆分,得到它的个位数、十位数和百位数。当然这个分解方法可以推广到任何多位数的拆分。
源代码
#includeint main() { int n; int p3; // 百位数 int p2; // 十位数 int p1; // 个位数 for (n = 100; n <= 999; n++) // 循环头:初始条件、循环条件、更新条件 { p1 = n % 10; // 得到个位数 p2 = n / 10 % 10; // 得到十位数 p3 = n / 100; // 得到百位数 if (n == p1 * p1 * p1 + p2 * p2 * p2 + p3 * p3 * p3) // if负责筛选工作 { printf("%d = %d^3 + %d^3 + %d^3n", n, p3, p2, p1); } } return 0; }
运行结果



