c语言基础程序——经典100道实例
-
- 001, 组无重复数字的数
- 002,企业发放的奖金根据利润提成
- 003,完全平方数
- 004,判断当天是这一年的第几天
- 005,三个数由小到大输出
- 006,输出字母C图案
- 007,特殊图案
- 008,9*9 乘法表
- 009,国际象棋棋盘
- 010,打印笑脸
- 011,兔子生崽
- 012,101到200的素数
- 013,水仙花数
- 014,分解质因数
- 015,(a>b)?a:b
- 016,最大公约数和最小公倍数
- 017,统计字母、数字等
- 018,s=a+aa+aaa...
- 019,完数
- 020,小球自由下落
- 021,猴子吃桃问题
- 022,乒乓球推理
- 023,打印菱形
- 024,2/1+3/2+5/3...
- 025,求阶乘的和
- 026,递归求阶乘
- 027,逆序打印字符
- 028,岁数推理
- 029,逆序打印各位数字
- 030,判断是否回文数
- 031,判断星期几
- 032,删字符串中的指定字母
- 033,判断是否质数
- 034,练习函数调用
- 035,字符串反转
- 036,100内的素数
- 037,排序
- 038,矩阵对角元素和
- 039,一个数插入数组
- 040,数组逆序输出
- 041,static用法1
- 042,auto用法
- 043,static用法2
- 044,extern的使用
- 045,register用法
- 046,宏#define练习1
- 047,宏#define练习2
- 048,宏#define练习3
- 049,#if,#ifdef,#ifndef
- 050,#include练习
- 051,按位与 &
- 052,按位或 |
001, 组无重复数字的数
题目: 有 1、2、3、4 四个数字,能组成多少个互不相同且无重复数字的三位数?
问题分析: 先在百位数选择一个数字,接着在十位上选择一个数字,最后在个位上选择一个数字,但要保证每次选择的三个数字都互不相同,使用三个for循环即可找出这样的数字。
/**
* Created by 公众号:数据结构和算法
* Copyright © wansuanfa.com All rights reserved.
*/
#include<stdio.h> // 标准的输入输出头文件
int main() {
for (int i = 1; i < 5; i++) {
// 先选择百位上的数字
for (int j = 1; j < 5; j++) {
// 接着选择十位上的数字
for (int k = 1; k < 5; k++) {
// 最后选择个位上的数字
// 选择的三个数字必须都互不相同
if (i != j && i != k && j != k) {
printf("%d%d%d\n", i, j, k);
}
}
}
}
return 0;
}
优化:上面代码中也可以在for循环的时候判断是否有重复的数字,如果有,则直接跳过。
运行结果:
123
124
132
134
142
143
213
214
231
234
241
243
312
314
321
324
341
342
412
413
421
423
431
432
002,企业发放的奖金根据利润提成
- 利润 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 ,求应发放奖金总数?
问题分析: 根据利润的区间,让数字在不同的区间分别单独计算。
/**
* Created by 公众号:数据结构和算法
* Copyright © wansuanfa.com All rights reserved.
*/
#include<stdio.h>
int main() {
double i;// 利润
double bonus = 0;// 奖金
printf("当月利润是:");
scanf("%lf", &i);// 输入当月利润
double bonus1 = 100000 * 0.1;// 十万的奖金
double bonus2 = bonus1 + 100000 * 0.075;// 二十万的奖金
double bonus4 = bonus2 + 200000 * 0.05;// 四十万的奖金
double bonus6 = bonus4 + 200000 * 0.03;// 六十万的奖金
double bonus10 = bonus6 + 400000 * 0.015;// 一百万的奖金
if (i <= 100000) {
// 利润 i 低于或等于10万元时,奖金可提10%;
bonus = i * 0.1;
} else if (i <= 200000) {
// 低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;
bonus = bonus1 + (i - 100000) * 0.075;
} else if (i <= 400000) {
// 20万到40万之间时,高于20万元的部分,可提成5%;
bonus = bonus2 + (i - 200000) * 0.05;
} else if (i <= 600000) {
// 40万到60万之间时高于40万元的部分,可提成3%;
bonus = bonus4 + (i - 400000) * 0.03;
} else if (i <= 1000000) {
// 60万到100万之间时,高于60万元的部分,可提成1.5%;
bonus = bonus6 + (i - 600000) * 0.015;
} else if (i > 1000000) {
// 高于100万元时,超过100万元的部分按1%提成。
bonus = bonus10 + (i - 1000000) * 0.01;
}
printf("应发奖金为:bonus=%lf", bonus);
return 0;
}
运行结果:
当月利润是:350000
应发奖金为:bonus=25000.000000
003,完全平方数
题目: 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
问题分析:
假设该数为 x。
1、则 x + 100 = m,x + 100 + 168 = n,其中 m 和 n 都是完全平方数。
2、设 n = a2,m = b2,则 n - m = (a + b)(a - b) = 168,因为a+b和a-b具有相同的奇偶性,又因为168是偶数,所以a+b和a-b都是偶数。
3、设 a+b=2*i,a-b=2*j;可得 i * j = 168/4=42。
4、接下来只需要枚举 i 从 1 到 42 即可,根据上面的公式我们也可以得出 a = i + j,b = i - j,进一步又可以得出 m ,n 以及 x 的值。
/**
* Created by 公众号:数据结构和算法
* Copyright © wansuanfa.com All rights reserved.
*/
#include <stdio.h>
int main() {
// 枚举 i 从 1 到 42 。
for (int i = 1; i <= 42; i++) {
if (42 % i == 0) {
// 要满足i*j=42
int j = 42 / i; // 计算 j 的值。
if (i > j) {
// 根据 i 和 j 可以计算 a ,b 以及 x 的值。
int a = i + j;
int b = i - j;
int x = b * b - 100;
printf("%d + 100 = %d * %d\n", x, b, b);
printf("%d + 268 = %d * %d\n", x, a, a);
}
}
}
return 0;
}
运行结果:
-99 + 100 = 1 * 1
-99 + 268 = 13 * 13
21 + 100 = 11 * 11
21 + 268 = 17 * 17
261 + 100 = 19 * 19
261 + 268 = 23 * 23
1581 + 100 = 41 * 41
1581 + 268 = 43 * 43
004,判断当天是这一年的第几天
题目: 输入某年某月某日,判断这一天是这一年的第几天?
问题分析: 先计算当月之前的总天数,然后再加上当月的天数。比如10月16号,先计算9月(包含9月)之前的总天数,然后加上10月的16天,最后在判断是否是闰年,如果是闰年并且输入的月份大于 2 ,要多加一天。
/**
* Created by 公众号:数据结构和算法
* Copyright © wansuanfa.com All rights reserved.
*/
#include <stdio.h>
int main() {
// 每月的天数,其中2月先暂定为28天。
const int daysInMonth[] = {
31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31};
int day, month, year, total;
printf("请输入年月日,格式为:年,月,日(2024,10,16)\n");
scanf("%d,%d,%d", &year, &month, &day); // 格式为:2024,10,16
total = 0; // 计算输入月份之前的总天数
for (int i = 0; i < month - 1; i++)
total += daysInMonth[i];
total += day;// 加上当月的天数
// 判断是否为闰年
int leap = (year % 400 == 0) ||
(year % 4 == 0 && year % 100 != 0);
// 如果是闰年且月份大于2, 总天数加一天
if (leap && month > 2)
total++;
printf("这是这一年的第 %d 天。", total);
return 0;
}
运行结果:
请输入年月日,格式为:年,月,日(2024,10,16)
2024,10,16
这是这一年的第 290 天。
005,三个数由小到大输出
题目: 输入三个整数 x、y、z,请把这三个数由小到大输出。
问题分析: 先用 x 和 y ,z 比较,只要比它俩小就交换,这样就可以保证 x 是这三个数中最小的。然后用 y 和 z 比较,把最大值保存在 z 中,这样 x、y、z 就是从小到大的了。
/**
* Created by 公众号:数据结构和算法
* Copyright © wansuanfa.com All rights reserved.
*/
#include <stdio.h>
// 交换两个变量的值
void swap(int *a, int *b) {
int tmp = *a;// 需要临时变量
*a = *b;
*b = tmp;
}
int main() {
int x, y, z;
printf("请输入三个数字:\n");
scanf("%d,%d,%d", &x, &y, &z);// 注意输入的时候用逗号隔开
// 两两比较,前两个if可以保证 x 最小,最后一个if可以保证 z 最大。
if (x > y)
swap(&x, &y);
if (x > z)
swap(&x, &z);
if (y > z)
swap(&y, &z);
printf("从小到大排序: %d %d %d\n", x, y, z);
return 0;
}
运行结果:
请输入三个数字:
3,7,6
从小到大排序: 3 6 7
006,输出字母C图案
题目: 用 * 号输出字母C的图案。
问题分析: 按照字母C的形状直接输出即可。
/**
* Created by 公众号:数据结构和算法
* Copyright © wansuanfa.com All rights reserved.
*/
#include <stdio.h>
int main() {
printf("用 * 号输出字母 C!\n");
printf("****\n");
printf("*\n");
printf("* \n");
printf("****\n");
return 0;
}
运行结果:
用 * 号输出字母 C!
****
*
*
****
007,特殊图案
题目: 输出特殊图案。
问题分析: 不同字符,图形不一样。需要把编码格式改成437 OEM-美国,否则会出现乱码。
/**
* Created by 公众号:数据结构和算法
* Copyright © wansuanfa.com All rights reserved.
*/
#include<stdio.h>
#include <windows.h> // 引用头文件
int main() {
SetConsoleOutputCP(437);// 设置编码为437 OEM-美国
char a = 177, b = 223;// 随便两个数字
printf("%c%c%c%c%c\n", b, a, a, a, b);
printf("%c%c%c%c%c\n", a, b, a, b, a);
printf("%c%c%c%c%c\n", a, a, b, a, a);
printf("%c%c%c%c%c\n", a, b, a, b, a);
printf("%c%c%c%c%c\n", b, a, a, a, b);
return 0;
}
运行结果:
008,9*9 乘法表
题目: 输出 9*9 口诀。
问题分析: 使用两个for循环即可完成。
/**
* Created by 公众号:数据结构和算法
* Copyright © wansuanfa.com All rights reserved.
*/
#include <stdio.h>
int main() {
for (int i = 1; i < 10; i++) {
// 行
for (int j = 1; j <= i; j++) {
// 列
// %-3d表示左对齐,占3位
printf("%d*%d=%-3d", j, i, i * j);
}
printf("\n"); // 换行
}
return 0;
}
运行结果:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
009,国际象棋棋盘
题目: 要求输出国际象棋棋盘。
问题分析: 国际象棋棋盘由64个黑白相间的格子组成,分为8行*8列。用 i 控制行, j 来控制列,根据 i+j 的和来控制输出黑方格,还是白方格。
/**
* Created by 公众号:数据结构和算法
* Copyright © wansuanfa.com All rights reserved.
*/
#include<stdio.h>
#include <windows.h> // 引用头文件
int main() {
SetConsoleOutputCP(437);// 设置编码为437 OEM-美国
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++)
if ((i + j) % 2 == 0)
printf("%c%c", 219, 219);// 白色
else
printf(" ");// 黑色
printf("\n");// 换行
}
return 0;
}
运行结果:
010,打印笑脸
题目: 打印楼梯,同时在楼梯上方打印两个笑脸。
问题分析: 用 ASCII 1 输出笑脸;用 i 和 j 来控制行和列,然后输出白色当做楼梯,要注意需要修改编码格式。
/**
* Created by 公众号:数据结构和算法
* Copyright © wansuanfa.com All rights reserved.
*/
#include<stdio.h>
#include <windows.h> // 引用头文件
int main() {
SetConsoleOutputCP(437);// 设置编码为437 OEM-美国
printf("\1\1\n"); // 打印两个笑脸
for (int i = 1; i < 10; i++) {
for (int j = 1; j <= i; j++)
printf("%c%c", 219, 219);// 打印白色楼梯
printf("\n");// 换行
}
return 0;
}
运行结果: