C语言程序与设计第四版课后习题 - 第五章(一)

第五章课后习题

5.1 求100-200的素数

题目概述:

求100-200之间的素数

题目思路:
  • 首先要求100-200之间的素数,首先你得要产生100-200的数,这样就用到循环。
  • 有了数字之后,我们要判断一个数是否是素数,首先要知道素数是什么
    • 素数:大于1的整数中,只能被1或者被自己整除的数
  • 既然知道了怎么样的数是素数,我们就可以开始处理了
    • 100 - 200的数一个一个去判断是否是素数,就需要用到循环遍历100-200的数,用i表示
    • 开始判断i是否为素数
      • 我们可以假设每个数都是素数,用flag来表示,1就是素数,0不是素数,然后最后把是素数的打印出来
      • 然后我们再使用一个循环,让i除2到i-1之间的数,
        • 如果有一个数能被2到i-1之间的数字整除,那么这个数就不是素数
          • 此时我们用一个选择语句来判断是否被相除为0了,如果为0就不是素数,既然不是素数我们就可以跳出循环,进行下一个i的判断
        • 如果有一个数不能被2到i-1之间的数字整除,那么这个数就是素数
代码实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	int flag = 0;

	for (i = 100; i <= 200; i++)
	{
		flag = 1;
		for (j = 2; j < i; j++)
		{
			if (i % j == 0)
			{
				flag = 0;
				break;
			}
		}
		if (flag == 1)
			printf("%d ", i);
	}

	return 0;
}

但是这代码是可以优化的:
优化1:由于偶数都不是素数,我们可以只从奇数项开始,每个数加+2让下一个也是奇数
优化2:当一个数不是素数的时候,一定能下成下列的一个式子,且他是可以被一个因子整除的
例:m = a *b
16 = 4 * 4
16 = 2 * 8
a和b中一个数字是 <= sqrt(m) →[4]

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <math.h>
int main()
{
	int i = 0;
	int count = 0;
	for (i = 101; i <= 200; i += 2)
	{
		int j = 0;
		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;
}

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

5.2 输入字符统计中英数个数

题目概述:

输人一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。

题目思路:
  • 首先因为我们要输入不止一个的字符,所以可以用循环来输入多个字符
    • 还记得教材第三章学的字符输入输出函数吗?也就是putchar和getchar在本题就使用上了。
  • 我们一般在输入的时候都是以回车来作为结束标志,所以我们可以用getchar函数来做判断条件,当getchar函数读到了’\n’(回车)的时候结束循环
    • 循环体内依次来判断每个字符的分类,题目要求四个分类 英文字母、空格、数字和其他字符,我们可以用if来判断。
代码实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	char c = 0;
	int letter = 0;	//字母个数
	int space = 0;	//空格个数
	int num = 0;	//数字个数
	int other = 0;	//其他字符个数


	while ((c = getchar()) != '\n')
	{
		if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
			letter++;
		else if (c >= '0' && c <= '9')
			num++;
		else if (c == ' ')
			space++;
		else
			other++;
	}

	printf("字母的个数是:%d\n", letter);
	printf("数字的个数是:%d\n", num);
	printf("空格的个数是:%d\n", space);
	printf("其他的个数是:%d\n", other);


	return 0;
}

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

5.3 打印水仙花数

题目概述:

输出所有的“水仙花数”,所谓“水仙花数”是指一个 3 位数,其各位数字立方和等于该数本身。

例如,153 是一水仙花数,因为 153=1^3 +5^3 +3^3

题目思路:
  • 首先水仙花数是三位数的,要输出所有的水仙花数,就要用到循环。
  • 剩下就简单了,我们直接把他的百位、十位、个位一个一个剥离出来
  • 剥离出来后用水仙花数的判断条件来判断是否是水仙花数,本题中我没有用pow函数而是直接让每个位乘以自己三次就是三次方了。
代码实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int i = 100;
	int hundred = 0;
	int ten = 0;
	int indiv = 0;

	for (i = 100; i <= 999; i++)
	{
		hundred = i / 100;
		ten = (i % 100) / 10;
		indiv = (i % 100) % 10;

		if ((hundred * hundred * hundred + ten * ten * ten + indiv * indiv * indiv) == i)
			printf("%d ", i);
	}


	return 0;
}

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

5.4 猴子吃桃

题目概述:

猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第 10 天早上想再吃时,就只剩一个桃子了。求第一天共摘多少个桃子。

题目思路:
  • 这道题首先要先逆推一下:
    • 第十天的时候只剩下一个,结合题目:以后每天早上都吃了前一天剩下的一半零一个,可推出
      • day10 = (day9 / 2) - 1,推出
      • day9 = (day10+1)* 2
    • 再算第八天
      • day8 = (day9 + 1) * 2
    • 我们用x1表示当天,x2表示x1的前一天得出代码:
代码实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int day = 9;	//因为第10天是1个,是已知的
	int x1 = 1;		//第10天的桃子为1
	int x2 = 0;

	while (day > 0)
	{
		x2 = (x1 + 1) * 2;
		x1 = x2;
		day--;
	}

	printf("%d", x2);
	
	return 0;
}

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

  • 19
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值