目录

第一题:无重复数字的三位数

题目:

1、2、3、4 四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

思路:

通过三重循环生成所有可能的三位数组合,每个位置(ijk)都可以取 1 到 4 之间的整数。使用条件语句检查每个组合中的三个数字是否互不相同。

对于每个符合条件的组合,将其打印出来。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
int main() {
int i,j,k;
printf("能组成的无重复数字的三位数有:\n");
for(i=1;i<5;i++)
{
for(j=1;j<5;j++)
{
for(k=1;k<5;k++)
{
if(i!=k&&i!=j&&j!=k)
{
printf("%d,%d,%d\n",i,j,k);
}
}
}
}
printf("结束");
return 0;
}

第二题:企业发放的奖金根据利润提成

题目:企业发放的奖金根据利润提成。

利润(I)低于或等于10万元时,奖金可提10%;

利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;

20万到40万之间时,高于20万元的部分,可提成5%;

40万到60万之间时高于40万元的部分,可提成3%;

60万到100万之间时,高于60万元的部分,可提成1.5%;

高于100万元时,超过100万元的部分按1%提成。

从键盘输入当月利润I,求应发放奖金总数?

答案:

请输入当月利润(单位:万元):12
应发放奖金总额为:1.15万元

思路:

这段问题的核心目标是根据企业当月的利润计算应发放的奖金总数。奖金的计算规则是分段累进的,即不同的利润区间对应不同的提成比例。代码通过一系列的条件判断来确定利润所在的区间,并应用相应的提成规则来计算奖金。

利润区间 提成率
≤10万元 10%
10万-20万元(超过部分) 7.5%
20万-40万元(超过部分) 5%
40万-60万元(超过部分) 3%
60万-100万元(超过部分) 1.5%
>100万元(超过部分) 1%

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>

int main() {
double profit, bonus = 0;

printf("请输入当月利润(万元):");
scanf("%lf", &profit);

if (profit <= 10) {
bonus = profit * 0.1;
} else if (profit <= 20) {
bonus = 10 * 0.1 + (profit - 10) * 0.075;
} else if (profit <= 40) {
bonus = 10 * 0.1 + 10 * 0.075 + (profit - 20) * 0.05;
} else if (profit <= 60) {
bonus = 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + (profit - 40) * 0.03;
} else if (profit <= 100) {
bonus = 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + 20 * 0.03 + (profit - 60) * 0.015;
} else {
bonus = 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + 20 * 0.03 + 40 * 0.015 + (profit - 100) * 0.01;
}

printf("应发放的奖金总数为:%.2f万元\n", bonus);

return 0;
}
  • 利润 ≤ 10 万元

    奖金=I×10%

  • 10 万元 < 利润 ≤ 20 万元

    奖金=10×10%+(I−10)×7.5%

  • 20 万元 < 利润 ≤ 40 万元

    奖金=10×10%+10×7.5%+(I−20)×5%

  • 40 万元 < 利润 ≤ 60 万元

    奖金=10×10%+10×7.5%+20×5%+(I−40)×3%

  • 60 万元 < 利润 ≤ 100 万元

    奖金=10×10%+10×7.5%+20×5%+20×3%+(I−60)×1.5%

  • 利润 > 100 万元

    奖金=10×10%+10×7.5%+20×5%+20×3%+40×1.5%+(I−100)×1%

第三题:请问该数是多少?

题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

思路:

通过题目整理出两个式子

式子一: x + 100 = n^2 ,

式子二: ( x + 100 ) + 168 = m^2

根据式子和题目要求,在进行循环判断是否满足要求。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

#include <stdio.h>

int main() {
for (int n = 0; n <= 1000; n++)
{ // 遍历可能的n值,从0到1000
int x = n * n - 100; // 计算x的值
if (x < 0)
{
continue; // 跳过负数解
}
// 判断x + 268是否为完全平方数
for (int m = 0; m * m <= x + 268; m++)
{
if (m * m == x + 268)
{
printf("%d + 100 = %d * %d\n", x, n, n);
printf("%d + 268 = %d * %d\n", x, m, m);
break; // 找到解后退出循环
}
}
}
return 0;
}

第四题:判断今天是今年的第几天

题目:输入某年某月某日,判断这一天是这一年的第几天?

程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。

思路: 首先我们可以判断一下是不是润年。月份我们可以保存在一个数组里面,然后我们需要检查一下我们输入的年份,月份,日期是否合法,然后再开始计算现在的日期是多少。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <stdio.h>

int isLeapYear(int year) {
// 闰年的判断规则:能被4整除且(不能被100整除或能被400整除)
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
return 1;
}
return 0;
}

int main() {
int year, month, day;
int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

printf("Please enter the year, month, and day (format: year month day): ");
//这里的 !=3是判断我们输入的数是否有3个,年,月,日,如果不满足3个的话,那就是格式有问题。
if (scanf("%d %d %d", &year, &month, &day) != 3)
{
printf("Invalid input. Please enter a valid year, month, and day.\n");
return 1;
}

// 检查年份是否合法
if (year <= 0) {
printf("Invalid year. Please enter a positive integer.\n");
return 1;
}

// 检查月份是否合法
if (month < 1 || month > 12) {
printf("Invalid month. Please enter a number between 1 and 12.\n");
return 1;
}

// 检查日期是否合法
if (isLeapYear(year)) {
daysInMonth[1] = 29; // 闰年2月有29天
}

if (day < 1 || day > daysInMonth[month - 1]) {
printf("Invalid day. Please enter a valid day.\n");
return 1;
}

// 计算从1月1日到输入日期的天数
int totalDays = 0;
for (int i = 0; i < month - 1; i++) {
totalDays += daysInMonth[i];
}
totalDays += day; // 加上当前月份的天数

printf("The date %d/%d/%d is the %dth day of the year.\n", day, month, year, totalDays);

return 0;
}

第五题:从小到大

题目:输入三个整数 x、y、z,请把这三个数由小到大输出。

思路: 我们可以写一个swap函数,然后使用指针直接修改数值。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

#include <stdio.h>

// 交换两个变量的值
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}

int main() {
int a, b, c;
printf("please input the number: \n");
scanf("%d %d %d", &a, &b, &c);

if (a > b) {
swap(&a, &b);
}
if (a > c) {
swap(&a, &c);
}
if (b > c) {
swap(&b, &c);
}

printf("small to big : %d %d %d\n", a, b, c);
return 0;
}

第六题:输出99乘法表

题目:输出 9*9 口诀。

思路: 使用循环嵌套来写这个代码,我们首先要让i=1的时候,做一遍1的乘法运算,也就是说我们的j<=i,所以我们第二个for循环就可以写成是让j也从1开始遍历,范围要小于等于i,以此递增。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*
99乘法表
*/
#include"stdio.h"
int main()
{
for(int i = 1;i<10;i++)
{
for(int j = 1 ; j <= i ; j++)
{
printf("%d * %d = %d ",i,j,i*j);
}
printf("\n");
}
return 0;
}

第七题:国际象棋棋盘

题目:要求输出国际象棋棋盘

思路: 首先我们要创建要给8*8的一个矩阵,再矩阵中,当行号 i 和列号 j 的和为偶数时,打印实心方块,当行号 i 和列号 j 的和为奇数时,打印空格

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

int main()
{
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
if((i+j)%2==0)
printf("%c%c",219,219);
else printf(" ");
printf("\n");
}
return 0;
}

第八题:打印楼梯,同时在楼梯上方打印两个笑脸。

题目:打印楼梯,同时在楼梯上方打印两个笑脸。

思路: 这个题目我们可以理解为实在输出一个*号楼梯。我们的外层循环用来控制循环的行数,内层循环用来控制每行的星号数量。

**代码: **

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "stdio.h"
int main()
{
printf("@@\n");
for(int i = 1;i<11;i++)
{
for(int j = 1 ;j <= i;j++)
{
printf("* ");
}
printf("\n");
}
return 0;
}

第九题:鸡兔同笼

题目:古典问题(兔子生崽):有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(输出前40个月即可)

思路: 首先我们要让前两个月为1,然后我们再来分析一下繁殖规则:成年兔子(≥3个月)每月生1对小兔子,小兔子出生后第3个月开始繁殖,所有兔子都不死亡

这样的话,我们就可以做出一个表格出来

月份 成年兔 未成年兔 总数 说明
1 0 1 1 初始1对未成年兔
2 1 0 1 上月的未成年兔成熟
3 1 1 2 成年兔生1对小兔
4 1 1 3 原有成年兔继续生1对
5 2 2 5 第3个月出生的小兔成熟并开始繁殖

这样我们可以写一个伪代码出来:

1
2
3
4
5
6
7
初始化前两个月 = 1
输出前两个月
for 月份从3到40:
本月 = 上月 + 前月
更新前月 = 上月
更新上月 = 本月
输出本月

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>

int main() {
// 初始化前两个月的兔子对数
long long month1 = 1; // 第1个月兔子对数
long long month2 = 1; // 第2个月兔子对数
long long current; // 当前月兔子对数

printf("月份\t兔子对数\n");
printf("1\t%lld\n", month1);
printf("2\t%lld\n", month2);

// 计算并输出第3到第40个月的兔子对数
for (int month = 3; month <= 40; month++) {
// 当前月兔子对数 = 上个月 + 上上个月
current = month1 + month2;
// 更新前两个月的值
month1 = month2;
month2 = current;
printf("%d\t%lld\n", month, current);
}
return 0;
}

第十题:判断素数

题目:判断 101 到 200 之间的素数。

程序分析:判断素数的方法:用一个数分别去除 2 到 sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。

思路: 判断素数,素数就是大于1且只能被1和自身整除的自然数。

伪代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
函数 isPrime(数字 num):
如果 num <= 1:
返回 false
如果 num <= 3:
返回 true
如果 num 能被2整除 或 num 能被3整除:
返回 false

初始化 i = 5
当 i * i <= num 时循环:
如果 num 能被 i 整除 或 num 能被 (i + 2) 整除:
返回 false
i 增加 6

返回 true

主函数 main():
打印 "素数在 101 到 200 之间的列表:"

对于 i 从 101 到 200:
如果 isPrime(i) 为真:
打印 i 和空格

打印换行

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// 题目:判断 101 到 200 之间的素数。
#include <stdio.h>
#include "stdbool.h"

bool isPrime(int num) {
// 小于等于1的数不是素数
if (num <= 1) return false;

// 2和3是素数
if (num <= 3) return true;

// 排除能被2或3整除的数
if (num % 2 == 0 || num % 3 == 0) return false;

// 优化循环:从5开始,每次增加6
for (int i = 5; i * i <= num; i += 6) {
// 检查6k±1形式的因子
if (num % i == 0 || num % (i + 2) == 0)
return false;
}

return true;
}

int main() {
printf("素数在 101 到 200 之间的列表:\n");

// 遍历101到200的所有整数
for (int i = 101; i <= 200; i++) {
if (isPrime(i)) {
printf("%d ", i); // 打印素数
}
}

printf("\n"); // 打印换行
return 0;
}

第十一题:水仙花数

题目:打印出所有的”水仙花数”,所谓”水仙花数”是指一个三位数,其各位数字立方和等于该数 本身。例如:153是一个”水仙花数”,因为153=1的三次方+5的三次方+3的三次方。

思路: 使用取余和除以相结合来分别取出他们的个十百位,然后再分别将他们的个位的立方和十位的立方和百位的立方相加是否等于这个数本身。

伪代码:

1
2
3
4
5
6
7
对于每个数字num从1到1000:
百位数字 = (num除以100)对10取余
十位数字 = (num除以10)对10取余
个位数字 = num对10取余
计算立方和 = 百位数字³ + 十位数字³ + 个位数字³
如果 立方和等于num:
输出num是一个水仙花数

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include "stdio.h"

int main()
{
int Units = 0;
int tens = 0;
int hundreds = 0;

for(int i = 100 ; i<1000;i++)
{
Units = i % 10;
tens = (i/10) % 10;
hundreds = (i/100) % 10;

int result = Units*Units*Units + tens*tens*tens + hundreds*hundreds*hundreds;

if(result == i)
{
printf("%d is the flowser numbers\n",i);
}
}

return 0;
}

第十二题:将一个正整数分解质因数

题目:将一个正整数分解质因数。例如:输入 90,打印出 90=2*3*3*5

思路: 质因数分解是将一个正整数表示为质数的乘积。我们需要从最小的质数2开始,逐步检查是否能整除输入的数。如果能整除,则该数是一个质因数,继续除以这个数直到不能整除为止。每次找到一个质因数后,将输入的数除以这个质因数,减少问题规模。继续检查下一个可能的因数,直到输入的数变为1。

伪代码:

1
2
3
4
5
6
7
8
9
读取用户输入的正整数 n;
如果 n 等于 1,直接输出 1;
初始化一个列表 factors,用于存储质因数;
从 i = 2 到 n:
当 n 能被 i 整除时:
将 i 添加到 factors 列表;
将 n 除以 i;
重复此过程直到 n 不能被 i 整除;
输出 factors 列表中的所有质因数。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>

int main() {
int num;

printf("请输入一个正整数:");
scanf("%d", &num);

if (num == 1) {
printf("1 的质因数分解为:1\n");
return 0;
}

printf("%d 的质因数分解为:", num);
for (int i = 2; i <= num; i++) {
while (num % i == 0) {
printf("%d", i);
num = num / i;
if (num == 1) {
printf("\n");
return 0;
}
printf(" × ");
}
}

return 0;
}

第十三题: 学习成绩

题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

思路: 可以使用if-else也可以使用三元法则。

伪代码:

1
2
3
4
输入一个成绩分数 score;
等级 = (score >= 90) ? "A" :
(score >= 60) ? "B" : "C";
输出 "成绩等级为:" + 等级;

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>

int main() {
int num;

printf("请输入一个正整数:");
scanf("%d", &num);

if (num == 1) {
printf("1 的质因数分解为:1\n");
return 0;
}

printf("%d 的质因数分解为:", num);
for (int i = 2; i <= num; i++) {
while (num % i == 0) {
printf("%d", i);
num = num / i;
if (num == 1) {
printf("\n");
return 0;
}
printf(" × ");
}
}

return 0;
}

第十四题:最大公约数和最小公倍数

题目:输入两个正整数m和n,求其最大公约数和最小公倍数

思路: 最小公倍数=输入的两个数之积除于它们的最大公约数,关键是求出最大公约数。求最大公约数用辗转相除法(又名欧几里德算法)

伪代码:

1
2
3
4
5
6
7
8
9
10
11
输入两个正整数 m 和 n;
计算最大公约数:
使用欧几里得算法:
当 n 不等于 0 时:
临时变量 temp = m % n;
m = n;
n = temp;
最大公约数为 m;
计算最小公倍数:
最小公倍数 = (原始 m * 原始 n) / 最大公约数;
输出最大公约数和最小公倍数;

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>

int main() {
int m, n, temp, original_m, original_n;

printf("请输入两个正整数 m 和 n:");
scanf("%d %d", &m, &n);

original_m = m;
original_n = n;

// 计算最大公约数(GCD)使用欧几里得算法
while (n != 0) {
temp = m % n;
m = n;
n = temp;
}
int gcd = m;

// 计算最小公倍数(LCM)
int lcm = (original_m * original_n) / gcd;

printf("最大公约数是:%d\n", gcd);
printf("最小公倍数是:%d\n", lcm);

return 0;
}

第十五题: 统计个数

题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

思路: 分别用对应的变量去保存中英文字母、空格、数字和其它字符的个数,利用while语句,条件为输入的字符不为’\n’。

伪代码:

1
2
3
4
5
6
7
8
9
10
11
12
初始化计数器:字母数 = 0,空格数 = 0,数字数 = 0,其他字符数 = 0;
输入一行字符;
对于这行字符中的每个字符:
如果字符是字母:
字母数 += 1
否则如果字符是数字:
数字数 += 1
否则如果字符是空格:
空格数 += 1
否则:
其他字符数 += 1
输出字母数、空格数、数字数和其他字符数。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>

int main() {
char c;
int letterCount = 0, spaceCount = 0, digitCount = 0, otherCount = 0;

printf("请输入一些字符:\n");

while ((c = getchar()) != '\n') {
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
letterCount++;
} else if (c >= '0' && c <= '9') {
digitCount++;
} else if (c == ' ') {
spaceCount++;
} else {
otherCount++;
}
}

printf("字母 = %d, 数字 = %d, 空格 = %d, 其他 = %d\n", letterCount, digitCount, spaceCount, otherCount);
return 0;
}

第十六题:s=a+aa+aaa+aaaa+aa…a的值

题目:s=a+aa+aaa+aaaa+aa…a 的值,其中 a 是一个数字,例如 2+22+222+2222+22222 (此时共有5个数相加),几个数相加有键盘控制。

**思路: ** 假设我们的输入的a是2,然后n是3,那我们最初是的值就是2,先通过一个总值sum来保存我们的这个初始值,通过一个临时变量来保存我们这个a,然后让a的值乘以10,再让我们刚刚的tmp加上我们现在的a,就变成了22,然后再保存到sum中。每做一次这种操作,我们就让n–。

伪代码:

1
2
3
4
5
6
7
8
9
sum = 0
输入 a 和 n
current = a
while n > 0:
sum = sum + current
a = a * 10
current = current + a
n = n - 1
输出 sum

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "stdio.h"
int main()
{
int a,n;
int tmp;
int sum = 0 ;
printf("please input the a & n\n");
scanf("%d%d",&a,&n);

tmp = a;
while (n > 0)
{
sum += tmp;
a *= 10;
tmp += a;
n--;
}

printf("sum = %d\n",sum);
return 0;
}

第十七题:完数