第一题
输入一行字符(使用getchar函数循环获取输入的每一个字符,直到回车字符结束循环),分别统计出其中的大写英文字母、小写英文字母、空格、数字和其他字符的个数。
解题思路如下:
- 首先,我们定义变量来统计大写英文字母、小写英文字母、空格、数字和其他字符的个数,初始值都为 0。
- 然后,使用 getchar 函数循环读取用户输入的字符,直到读取到回车字符 \n 为止。
- 在循环中,对于每个读取到的字符,通过条件语句判断它的类型:
如果字符在大写字母范围内(‘A’ 到 ‘Z’),则将大写字母计数加一。
如果字符在小写字母范围内(‘a’ 到 ‘z’),则将小写字母计数加一。
如果字符是空格,则将空格计数加一。
如果字符在数字范围内(‘0’ 到 ‘9’),则将数字计数加一。
否则,将其他字符计数加一。
- 最后,输出各个类型字符的个数。
介绍gether函数:
getchar 是一个标准库函数,用于从标准输入流(通常是键盘输入)中获取一个字符。getchar 函数不需要任何参数,每次调用都会从标准输入中读取下一个字符,并将其作为返回值返回。如果没有可用的字符(例如已经读到文件末尾或者出现了输入错误),则返回一个特殊值 EOF(End of File)。
通常情况下,getchar 函数会与循环结合使用,用来逐个读取用户输入的字符,直到满足某个条件退出循环。例如,可以使用 getchar 来实现逐字符处理用户输入的字符串,或者用于处理文本文件的内容。
#include <stdio.h> int main(){ int uppercase = 0;//初始化大写英文字母个数 int lowercase = 0;//初始化小写英文字母个数 int space = 0;//初始化空格字符个数 int digit = 0;//初始化数字字符个数 int other = 0;//初始化其他字符个数 char ch; printf("请输入一行字符:\n"); //循环历经字符串每一个字符直到末端 while ((ch = getchar()) != '\n') { if (ch >= 'A' && ch <= 'Z') { uppercase++; } else if (ch >= 'a' && ch <= 'z') { lowercase++; } else if (ch == ' ') { space++; } else if (ch >= '0' && ch <= '9') { digit++; } else { other++; } } //输出每个字符的个数 printf("大写英文字母个数:%d\n", uppercase); printf("小写英文字母个数:%d\n", lowercase); printf("空格个数:%d\n", space); printf("数字个数:%d\n", digit); printf("其他字符个数:%d\n", other); return 0; }
第二题
水仙花数是各位数字立方之和等于数字本身的三位整数,编写程序求出所有的水仙花数并输出。
解题思路:
我们使用 for 循环遍历所有的三位数(从 100 到 999)。对于每个数字,我们使用 while 循环来依次计算它的各个位上数字的立方和。
在 while 循环中,我们将当前数字 temp 的个位数提取出来,并将其立方加到总和 sum 上,然后将 temp 除以 10,继续处理下一位数,直到 temp 变为 0。
完成 while 循环后,我们将 sum 与原始数字 num 进行比较。如果它们相等,则说明该数字是水仙花数,我们将其输出。
最后,我们输出所有的水仙花数。
#include <stdio.h> int main(){ int num = 0;//初始化要查询的数字 int diglit = 0; int sum = 0; printf("水仙花数有:\n"); //循环历经一遍100-999 for (num = 100; num < 999; num++) { int temp = num;//创建一个变量用于寻找每一位数字、 //每一位的三次求和 while(temp>0){ diglit = temp%10; sum+=diglit*diglit*diglit; temp/=10;//防止程序死循环 } if(num==sum){ printf("%d ",num); } sum = 0;//更新sum } }
第三题
棋盘麦粒问题。在印度有一个古老的传说:舍罕王打算奖赏国际象棋的发明人——宰相达依尔。国王问他想要什么,他对国王说:“陛下,请您在这张棋盘的第 1 个小格里,赏给我 1 粒麦子,在第 2 个小格里给 2 粒,第 3 小格给 4 粒,像这样,后面一格里的麦粒数量总是前面一格里的麦粒数的 2 倍。请您把这样摆满棋盘上所有的 64 格的麦粒,都赏给您的仆人吧!”国王觉得这要求太容易满足了,于是令人扛来一袋麦子,可很快就用完了。当人们把一袋一袋的麦子搬来开始计数时,国王才发现:就是把全印度的麦粒全拿来,也满足不了那位宰相的要求。那么,宰相要求得到的麦粒到底有多少呢?假如体积为 1 立方米的麦粒约为 1.42×108粒,请编程计算宰相要求得到的麦粒体积为多少?
解题思路
使用for循环,将1一直乘2,每次都加到一个临时变量中,得出最终结果
#include <stdio.h> int main() { unsigned long long nums = 0; // 存储麦粒 unsigned long long wheat = 1; double grain = 1.42e8; // 体积为 1 立方米的麦粒数量 //循环进行计算 for (int i = 1; i <= 64; ++i) { nums += wheat; wheat *= 2; } double volume = (double )nums * grain; // 计算总体积 printf("麦粒的个数为:%llu\n",nums); printf("麦粒体积为:%.2e 立方米\n",volume); return 0; }