【C语言|RUNOOB教程|期末常考题】100道经典例题详解(6~10题)

前言

本系列为精选C语言菜鸟刷题系列,意在巩固已经学习的C语言知识。每天5题,菜鸟逆袭~~~
在这里插入图片描述


实例1

题目: 输出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;
}

运行结果:
【C语言|RUNOOB教程|期末常考题】100道经典例题详解(6~10题)_第1张图片


实例2

题目: 古典问题(兔子生崽):有一对兔子,从出生后第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;
}

运行结果:
【C语言|RUNOOB教程|期末常考题】100道经典例题详解(6~10题)_第2张图片
递归解法:

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越大时,会耗费大量的时间才能算出结果。所以不推荐使用递归解法。


实例3

题目: 判断 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;
}

运行结果:
在这里插入图片描述


实例4 - 水仙花数

题目: 打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数 本身。例如: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;
}

运行结果:
【C语言|RUNOOB教程|期末常考题】100道经典例题详解(6~10题)_第3张图片


实例5

题目: 将一个正整数分解质因数。例如:输入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;
}

运行结果:

【C语言|RUNOOB教程|期末常考题】100道经典例题详解(6~10题)_第4张图片


你可能感兴趣的:(C,菜鸟教程100例,c语言)