本系列为精选C语言菜鸟刷题系列,意在巩固已经学习的C语言知识。每天5题,菜鸟逆袭~~~
题目: 输出9*9口诀。
程序分析: 分行与列考虑,共 9 行 9 列,i 控制行,j 控制列。
具体代码:
#include
int main()
{
int i, j, result;
for (i = 1; i <= 9; i++)
{
for (j = 1; j <= i; j++)
{
result = i * j;
printf("%d*%d=%-3d", i, j, result); //-3d表示左对齐,占3位
}
printf("\n");//打印每一行后,换行
}
return 0;
}
题目: 古典问题(兔子生崽):有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(输出前40个月即可)
程序分析: 这是典型的斐波那契数列问题。兔子的规律为数列1,1,2,3,5,8,13,21…,即下个月是上两个月之和(从第三个月开始)。我们采用迭代循环的方法解决。
迭代循环:重复执行一系列运算步骤,从前面的量依次求出后面的量的过程,直至满足条件为止。
迭代解法: 知道初值,迭代公式,结束条件即可
#include
int main()
{
int f1 = 1, f2 = 1, i;
for (i = 1; i <= 20; i++)
{
printf("%12d%12d", f1, f2);
if (i % 2 == 0) printf("\n");
f1 = f1 + f2;
f2 = f1 + f2;
}
return 0;
}
int fib(int N)
{
if (N < 2)
{
return N;
}
return fib(N - 1) + fib(N - 2);
}
int main()
{
int i;
printf("month\tnumber\n");
for (i = 1; i < 41; i++)
{
printf("%d\t%d\n", i, fib(i));
}
return 0;
}
为什么不推荐用递归解法? |
假如我们要计算的N为10,我们要先计算fib(9),再计算fib(8);
计算fib(9), 要计算fib(8)和fib(7),如此递归下去
计算fib(8), 要计算fib(7)和fib(6),如此递归下去
我们发现,内存会为fib函数开辟大量的空间,而且重复做了大量的无用功。同时,我们通过运行递归解法的代码会发现当N越大时,会耗费大量的时间才能算出结果。所以不推荐使用递归解法。
题目: 判断 101 到 200 之间的素数。
程序分析: 判断x是素数的方法:用x分别去除 2 到 sqrt(x),如果能被整除,则表明此数不是素数,反之是素数。
具体代码:
#include
#include //sqrt()的头文件是
int main()
{
int i, j, k;
for (i = 101; i < 201; i++)
{
k = sqrt(i);//如果i不能被2~sqrt(i)间任一整数整除,i必定是素数
for (j = 2; j <= k; j++)
{
if (i % j == 0)
break;
}
if (j > k) printf("%d ", i);
}
printf("\n");
return 0;
}
题目: 打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数 本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
程序分析: 利用for循环控制100-999个数,每个数分解出个位,十位,百位。若满足"水仙花数"的条件,则打印
具体代码:
#include
int main()
{
int i, x, y, z;
for (i = 100; i < 1000; i++)//三位数
{
x = i % 10;//个位
y = i / 10 % 10;//十位
z = i / 100 % 10;//百位
if (i == (x * x * x + y * y * y + z * z * z))
printf("%d\n", i);
}
return 0;
}
题目: 将一个正整数分解质因数。例如:输入90,打印出90=233*5。
程序分析: 对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)如果这个质数恰等于(小于的时候,继续执行循环)n,则说明分解质因数的过程已经结束,另外 打印出即可。
(2)但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数n.重复执行第二步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
具体代码:
#include
int main()
{
int n,i;
printf("请输入整数:");
scanf("%d",&n);
printf("%d=",n);
for(i=2;i<=n;i++)
{
while(n%i==0)
{
printf("%d",i);
n/=i;
if(n!=1) printf("*");
}
}
printf("\n");
return 0;
}
运行结果: