第十三题:
题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数 本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
思路解析:首先我们知道是三位数,那么我们就从100到999便利所有数字,找出符合条件的即可,再然后个依据题目意思,我们需要求出正在计算的数的百分位,十分位,个分位,使得他们的立方等于本身即可。
#include <stdio.h>
int main()
{
int i, x, y, z;
int count = 0;
for (i = 100; i <= 999; i++)
{
x = i % 10;
y = i % 100 / 10;
z = i / 100;
if ((x * x * x+ y * y * y + z * z * z) == i)
{
count++;
printf("水仙花数:%d\n", i);
}
}
//printf("\n");
printf("个数为:%d", count);
return 0;
}
第十四题:
题目:将一个正整数分解质因数。例如:输入 90,打印出 90=2*3*3*5。
思路解析:首先想到的是用for循环遍历2到输入的数里所有的数,当number%i为0时,意味着我们找到了所有的因数,然后不断用number/i,就是用一个while循环
#include <stdio.h>
int main()
{
int number;
int i;
printf("输入数字:");
scanf_s("%d", &number);
for (i = 2; i <= number; i++)
{
while (number % i == 0)
{
number = number / i;
printf("%d ", i);
}
}
return 0;
}
第十五题:
题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
思路解析:首先题目已经明确了我们药用用运算符的嵌套去完成,那么我们就肯定要使用三目运算符。
#include <stdio.h>
int main()
{
int score;
char data;
printf("输入成绩:");
scanf_s("%d", &score);
data = (score >= 90) ? 'A' : ((score > 60) ? 'B' : 'C');
printf("%c\n", data);
return 0;
}
第十六题:
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
思路解析:这个在网上搜一下相关的的公式其实还蛮好写的,一开始用的直接是for循环求解,后面看官方给的思路,就是用了官方的思路
#include <stdio.h>
int main()
{
int datax, datay;
int max_data, min_data;
printf("输入两个数: ");
scanf_s("%d %d", &datax, &datay);
// 保存原始值,因为后面会修改
int original_x = datax;
int original_y = datay;
// 确保datax是较大的数
if (datax < datay) {
int temp = datax;
datax = datay;
datay = temp;
}
// 使用欧几里得算法求最大公约数
int remainder;
while (datay != 0) {
remainder = datax % datay;
datax = datay;
datay = remainder;
}
max_data = datax; // 最大公约数
// 计算最小公倍数
min_data = (original_x * original_y) / max_data;
// 输出结果
printf("最大公约数:%d\n", max_data);
printf("最小公倍数:%d\n", min_data);
return 0;
}
第十七题:
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
思路解析:这个思路还是很好想的,但是有些细节问题要注意。首先我们读取个数,我们肯定要变量来统计,符合条件就+1,但是我们输入的是一行字符串,所以我们要考虑到‘\0’的存在,然后我们在打印换行的时候也要考虑到‘’\n的情况。然后我在输入字符串的时候一直出问题,后面发现要写成scanf_s("%[^\n]", str, (unsigned)sizeof(str)); 还有在for循环的时候,一开始for (i = 0; str[i] != '\0'; i++)里面的str[i],我本能的写成了i导致一直出问题,后面调试发现这个条件不会成立的
#include <stdio.h>
int main()
{
char str[100];
int i, c;
int english = 0, space = 0, number = 0, other = 0;
printf("输入一行字符:");
scanf_s("%[^\n]", str, (unsigned)sizeof(str)); // 读取直到换行符
for (i = 0; str[i] != '\0'; i++)
{
c = str[i];
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
{
english++;
}
else if (c >= '0' && c <= '9')
{
number++;
}
else if (c == ' ')
{
space++;
}
else
{
if (c != '\n' && c != '\0')
{
other++;
}
}
}
printf("英文字母:%d\n", english);
printf("数字:%d\n", number);
printf("空格:%d\n", space);
printf("其他字符:%d\n", other);
return 0;
}
第十八题:
题目:求 s=a+aa+aaa+aaaa+aa...a 的值,其中 a 是一个数字,例如 2+22+222+2222+22222 (此时共有5个数相加),几个数相加有键盘控制。
思路解析:这个用循环,有几个数相加我们就循环几次,我们看举出的例子:2,22,222....这些都可以前一个数*10+2,就是我们把初始值*10+初始值就可以得到下一个数,下一个数*10+初始值就可以得到下下个数依次类推。但是要注意,int类型可能会有点小
#include <stdio.h>
int main()
{
int sum = 0;
int count, a, i, temp = 0;
printf("输入几个数相加:");
scanf_s("%d", &count);
printf("输入初始数值:");
scanf_s("%d", &a);
for (i = 1; i <= count; i++)
{
temp = temp * 10 + a;
sum += temp;
}
printf("总和:%d\n", sum);
return 0;
}