C 语 言 --- 经 典 习 题 2

💻作者简介:曾 与 你 一 样 迷 茫,现 以 经 验 助 你 入 门 C 语 言
💡个人主页:@ 笑 口 常 开 xpr 的 个 人 主 页
📚系列专栏:C 启 新 程
✨代码趣语:任 何 傻 瓜 都 能 写 出 计 算 机 能 理 解 的 代 码。优 秀 的 程 序 员 写 出 人 类 能 理 解 的 代 码
💪代码千行,始 于 坚 持 ,每 日 敲 码,进 阶 编 程 之 路。

在这里插入图片描述

       在 编 程 的 奇 妙 宇 宙 里,每 一 道 C 语 言 的 题 目 都 宛 如 一 颗 神 秘 的 星 辰 ,潜 藏 着 无 尽 的 解 题 思 路 和 创 新 可 能 。你 可 曾 在 夜 深 人 静 时 苦 思 冥 想,一 道 看 似 简 单 的 C 语言 题 目 背 后 ,究 竟 藏 着 怎 样 的 算 法 奥 秘 ?又 能 为 我 们 解 决 实 际 问题 带 来 怎 样 的 启 发 ?今 天 ,让 我 们 投 身 C 语 言 刷 题 海 洋,挖 掘 代 码 宝 藏 ,体 验 解 题 快 感,解 锁 其 无 限 潜 力,向 编 程 高 手 迈 进!

第 一 题 - - - 素 数

描 述:
输 入 整 数 num1 和 整 数 num2,求 出 大 于 等 于 num1 并 且 小 于 等 于 num2 之 间 的 所 有 素 数。
输 入 描 述:
两 个 整 数,中 间 用 空 格 隔 开。
输 出 描 述:
多 行,素 数 之 间 用 空 格 隔 开,前 面 输 出 素 数,最 后 一 行 输 出 素 数 的 总 个 数。

思 路 分 析:
         输 入 两 个 整 数,计 算 并 找 出 这 两 个 整 数 之 间 的 全 部 素 数。为 解 决 此 问 题,首 先 需 要 掌 握 素 数 的 定 义,明 确 素 数 所 具 备 的 数 学 特 征。然 后 还 需 进 一 步 思 考 并 确 定 采 用 何 种 合 适 的 算 法 或 方 法 ,以 便 高 效 、准 确 地 找 出 给 定 区 间 内 的 所 有 素 数。

素 数

         素 数,又 称 为 质 数,是 指 在 大 于 1 的 自 然 数 中,除 了 1 和 它 本 身 以 外 不 再 有 其 他 因 数 的 自 然 数。

素 数 的 性 质

  • 无 穷 性:素 数 有 无 穷 多 个。
  • 分 布 规 律:素 数 在 自 然 数 中 的 分 布 是 没 有 明 显 规 律 的,随 着 数 字 的 增 大,素 数 的 分 布 越 来 越 稀 疏。
  • 特 殊 性 质:除 了 2 以 外,所 有 的 素 数 都 是 奇 数。因 为 偶 数 都 能 被 2 整 除,所 以 除 2 外 的 偶 数 都 不 是 素 数。

温 馨 提 示:读 者 们 ,先 自 己 写 代 码,这 是 提 升 编 程 能 力 的 好 机 会。若 未 达 要 求 ,别 气 馁 ,参 考 下 文 代 码 会 有 新 收 获。

         首 先 我 们 可 以 先 通 过 循 环 来 找 出 两 个 整 数 之 间 的 所 有 整 数,然 后 在 这 些 整 数 中 找 到 所 有 的 素 数。

方 法 一:

试除法:
         对 于 给 定 的 正 整 数 n,从 2 开 始,依 次 用 n 除 以 每 个 小 于 n 的 正 整 数 i。如 果 在 这 个 过 程 中,存 在 某 个 i 使 得 n 能 被 i 整除,那 么 这 个 数 就 不 是 素 数;如 果 n 不 能 被 任 何 一 个 小 于 它 的 正 整 数 整 除,那 么 n 就 是 质 数。

下 面 展 示 代 码 示 例

#include<stdio.h>
int main()
{
	int num1 = 0;
	int num2 = 0;
	scanf("%d %d", &num1, &num2);
	int i = 0;
	int count = 0;
	for (i = num1;i <= num2;i++)
	{
		if (i == 2)//将数字2单独处理
		{
			printf("%d ", i);
			continue;
		}
		int j = 0;
		int flag = 0;//每次判断前将flag重置为0
		for (j = 2;j < i;j++)
		{
			if (i % j == 0)
			{
				flag = 1;//flag为标志位,记录这个数是否为素数
				break;
			}
		}
		if (flag == 0)
		{
			count++;//计数器count,记录素数的个数。
			printf("%d ", i);
		}
		if (i == num2)
		{
			printf("\n");
		}
	}
	printf("%d\n", count + 1);//输出时加上2
	return 0;
}

方 法 二 :

         方 法 一 判 断 一 个 数 n 是 否 为 素 数 时,需 逐 个 试 除 从 2 到 该 数 之 间 的 所 有 数 字,过 程 繁 琐,导 致 程 序 效 率 较 低。而 方 法 二 则 利 用 了 素 数 的 特 性 ,优 化 了 判 断 逻 辑,显 著 提 升 了 代 码 的 执 行 效 率。实 际 上,不 需 要 试 除 到 n - 1,只 需 要 试 除 到 根 号 n 即 可。这 是 因 为 如 果 n 有 一 个 大 于 根 号 n 的 因 数 a,那 么 必 然 存 在 一 个 小 于 根 号 n 的 因 数 b,使得 n = a * b。

下 面 展 示 代 码 示 例

#include<stdio.h>
#include<math.h>
int main()
{
	int i = 0;
	int j = 0;
	int num1 = 0;
	int num2 = 0;
	int flag1 = 1;
	scanf("%d %d", &num1, &num2);
	for (i = num1;i <= num2;i+=2)
	{
		if (i == 2)//将数字2单独处理
		{
			printf("%d ", i);
			i = 1;//保留3
			continue;
		}
		if (num1 % 2 == 0 && flag1 == 1 && num1 != 2)
		{
			flag1 = 0;
			i = i - 1;//保留num1 + 1
			continue;
		}
		int flag = 1;
		for (j = 2;j <= sqrt(i);j++)
		{
			if (i % j == 0)
			{
				flag = 0;
				break;
			}
		}
		if (flag == 1)
		{
			printf("%d ", i);
		}
	}
	return 0;
}

总 结
         在 上 面 的 代 码 中 ,引 入 了 头 文 件 math.h 中 的 sqrt 函 数 用 来 求 根 号 n。sqrt 用 于 求 解 一 个 数 的 平方 根 ,读 者 可 以 通 过 点 击 蓝 色 字 体 来 学 习 sqrt 的 相 关 使 用 技 巧。这 段 代 码 还 使 用 了 多 个 if 语 句 进 行 特 殊 值 的 筛 选,以 及 确 保 这 个 数 是 奇 数。

在这里插入图片描述

方 法 三:

因 式 分 解:
        对 于 一 个 整 数 n,从 2 开 始,依 次 用 n 除 以 每 个 可 能 的 因 数 i。如 果 n 能 被 i 整 除,那 么 i 就是 n 的 一 个 因 数,将 n 更 新 为 n / i,继 续 用 i 除 以 更 新 后 的 n,直 到 n 不 能 被 i 整 除 为 止,然 后 再 将 i 加 1,重 复 上 述 过 程,直 到 n 变 为 1。

下 面 展 示 代 码 示 例

#include <stdio.h>

int main() 
{
    int start = 0;
    int end = 0;
    scanf("%d %d", &start, &end);
    //确保起始值小于等于结束值
    if (start > end) 
    {
        int temp = start;
        start = end;
        end = temp;
    }
    //遍历从起始值到结束值的每一个数
    for (int num = start; num <= end; num++) 
    {
        // 素数定义要求大于1,小于2的数直接跳过
        if (num < 2)
        {
            continue;
        }
        int is_prime = 1;
        int n = num;
        //从2开始尝试对当前数进行因式分解
        for (int i = 2; i <= n; i++) 
        {
            while (n % i == 0) 
            {
                // 如果能被i整除,说明i是因数
                n /= i;
                if (n != 1)
                {
                    //若分解后n不为1,说明num不是素数
                    is_prime = 0;
                }
            }
            if (!is_prime)
            {
                // 一旦确定不是素数,跳出内层循环
                break;
            }
        }
        if (is_prime) 
        {
            printf("%d ", num);
        }
    }
    printf("\n");
    return 0;
}

第 二 题 - - - 反 向 输 出 一 个 整 数

描 述:
将 一 个 整 数,反 向 输 出。
输 入 描 述 :
一 行 ,输 入 一 个 整 数 n(1000 <= n <= 9999)。
输 出 描 述 :
针 对 每 组 输 入,反 向 输 出 对 应 的 数。
示 例 1 :
输 入 :1234
输 出 :4321
示 例 2 :
输 入 :5678
输 出 :8765

解 题 必 备
         解 决 这 道 题 的 关 键 在 于 如 何 得 到 这 个 数 的 每 一 位,并 将 数 字 反 向 输 出

温 馨 提 示:读 者 们 ,先 自 己 写 代 码,这 是 提 升 编 程 能 力 的 好 机 会。若 未 达 要 求 ,别 气 馁 ,参 考 下 文 代 码 会 有 新 收 获。

下 面 展 示 代 码 示 例

#include <stdio.h>

int main()
{
    int num = 0;
    scanf("%d", &num);
    while (num)
    {
        printf("%d", num % 10);
        num = num / 10;
    }
    return 0;
}

第 三 题 - - - 水 仙 花 数

描 述:
         春 天 是 鲜 花 的 季 节,水 仙 花 就 是 其 中 最 迷 人 的 代 表,数 学 上 有 个 水 仙 花 数,他 是 这 样 定 义 的: “水 仙 花 数 ” 是 指 一 个 三 位 数,它 的 各 位 数 字 的 立 方 和 等 于 其 本 身,比 如:153 = 1 ^ 3 + 5 ^ 3 + 3 ^ 3。
输 入 描 述 :

输 出 描 述 :
输 出 三 位 数 中 所 有 的 水 仙 花 数

解 题 必 备
         对 于 100 - 999 之 间 的 每 一 个 数,分 别 求 出 个 位,十 位,百 位,然 后 计 算 它 们 的 立 方 之 和 是 否 等 于 该 数 本 身,如 果 等 于,则 是 水 仙 花 数,否 则 不 是。

温 馨 提 示:读 者 们 ,先 自 己 写 代 码,这 是 提 升 编 程 能 力 的 好 机 会。若 未 达 要 求 ,别 气 馁 ,参 考 下 文 代 码 会 有 新 收 获。

下 面 展 示 代 码 示 例

#include <stdio.h>
int main() 
{
	int i = 0;
	int ge = 0; 
	int shi = 0;
	int bai = 0;
	for (i = 100; i < 1000; i++) 
	{
		ge = i % 10;// 个位
		shi = i / 10 % 10;// 十位
		bai = i / 100;// 百位
		if (i == ge * ge * ge + shi * shi * shi + bai * bai * bai)
		{
			printf("%d\n", i);
		}
	}
	return 0;
}

第 四 题 - - - 变 种 水 仙 花 数

描 述:
       变 种 水 仙 花 数 - Lily Number:把 任 意 的 数 字,从 中 间 拆 分 成 两 个 数 字,比 如 1461 可 以 拆 分 成(1 和 461),( 14 和 61),( 146 和 1), 如 果 所 有 拆 分 后 的 乘 积 之 和 等 于 自 身,则 是 一 个 Lily Number。
例如:
655 = 6 * 55 + 65 * 5
1461 = 1 * 461 + 14 * 61 + 146 * 1
求 出 5 位 数 中 的 所 有 Lily Number。
输 入 描 述 :

输 出 描 述 :
一 行 ,5 位 数 中 的 所 有 Lily Number,每 两 个 数 之 间 间 隔 一 个 空 格。

温 馨 提 示:读 者 们 ,先 自 己 写 代 码,这 是 提 升 编 程 能 力 的 好 机 会。若 未 达 要 求 ,别 气 馁 ,参 考 下 文 代 码 会 有 新 收 获。

下 面 展 示 代 码 示 例

#include <stdio.h>
int main() 
{
	int i = 0;
	for (i = 10000; i <= 99999; i++) 
	{
		if (i == (i/10000)*(i%10000)+(i/1000)*(i%1000)+(i/100)*(i%100)+(i/10)*(i%10)) 
		{
			printf("%d ", i);
		}
	}
	return 0;
}

在这里插入图片描述

总结

       至 此,关 于 C 语 言 的 探 索 暂 告 一 段 落 ,但 你 的 编 程 征 程 才 刚 刚 启 航。写 代 码 是 与 机 器 深 度 对 话 ,过 程 中 虽 会 在 语 法 、算 法 困 境 里 挣 扎,但 这 些 磨 砺 加 深 了 对 代 码 的 理 解。愿 你 合 上 电 脑 后,灵 感 不 断,在 C 语 言 的 世 界 里 持 续 深 耕,书 写 属 于 自 己 的 编 程 传 奇,下 一 次 开 启 ,定 有 全 新 的 精 彩 等 待。小 编 期 待 重 逢,盼 下 次 阅 读 见 你 们 更 大 进 步,共 赴 代 码 之 约!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值