第五章课后习题
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之间的数字整除,那么这个数就是素数
- 如果有一个数能被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;
}
运行结果如下: