实例1—无重复数字组数
1.题目:有 1、2、3、4 四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?并求出个数。
程序分析:可填在百位、十位、个位的数字都是 1、2、3、4,组成所有的排列后再去掉不满足条件的排列。
#include <stdio.h>
int main() {
int i, j, k; // 分别代表百位、十位、个位的数字
int count = 0; // 计数器,记录符合条件的三位数总数
printf("所有互不相同的三位数:\n");
// 百位循环:i从1到4
for (i = 1; i <= 4; i++) {
// 十位循环:j从1到4
for (j = 1; j <= 4; j++) {
// 个位循环:k从1到4
for (k = 1; k <= 4; k++) {
// 检查三个数字是否互不相同
if (i != j && i != k && j != k) {
// 组合成三位数:例如i=1, j=2, k=3 → 123
int number = i * 100 + j * 10 + k;
printf("%d\n", number);
count++; // 每找到一个符合条件的数,计数器加1
}
}
}
}
// 输出总数
printf("\n总共有 %d 个符合条件的三位数。\n", count);
return 0;
}
运行结果:
所有互不相同的三位数:
123
124
132
134
...
431
432
总共有 24 个符合条件的三位数。
实例2—区间利润提成问题
2.题目:企业发放的奖金根据利润提成。
利润(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,求应发放奖金总数?
程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成双精度浮点(double)型。
#include <stdio.h>
int main() {
double profit; // 输入的利润(单位:万元)
double bonus = 0.0; // 初始化奖金总额
printf("请从键盘输入当月利润(万元):");
scanf("%lf", &profit); // 注意:输入时使用小数,例如10.5表示10.5万元
// 根据利润区间分段计算奖金
if (profit <= 10) {
bonus = profit * 0.10;
} else if (profit <= 20) {
bonus = 10 * 0.10 + (profit - 10) * 0.075;
} else if (profit <= 40) {
bonus = 10 * 0.10 + 10 * 0.075 + (profit - 20) * 0.05;
} else if (profit <= 60) {
bonus = 10 * 0.10 + 10 * 0.075 + 20 * 0.05 + (profit - 40) * 0.03;
} else if (profit <= 100) {
bonus = 10 * 0.10 + 10 * 0.075 + 20 * 0.05 + 20 * 0.03 + (profit - 60) * 0.015;
} else {
bonus = 10 * 0.10 + 10 * 0.075 + 20 * 0.05 + 20 * 0.03 + 40 * 0.015 + (profit - 100) * 0.01;
}
printf("应发放奖金总额(即提成)为:%.2f 万元\n", bonus); // 保留两位小数
return 0;
}
运行结果:
请输入当月利润(万元):15
应发放奖金总额为:1.38 万元
请输入当月利润(万元):30
应发放奖金总额为:2.00 万元
请输入当月利润(万元):150
应发放奖金总额为:4.45 万元
实例3—完全平方数
3.题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
程序分析:
假设该数为 x。
1、则:x + 100 = n2, x + 100 + 168 = m2
2、计算等式:m2 - n2 = (m + n)(m - n) = 168
3、设置: m + n = i,m - n = j,i * j =168,i 和 j 至少一个是偶数
4、可得: m = (i + j) / 2, n = (i - j) / 2,i 和 j 要么都是偶数,要么都是奇数。
5、从 3 和 4 推导可知道,i 与 j 均是大于等于 2 的偶数。
6、由于 i * j = 168, j>=2,则 1 < i < 168 / 2 + 1。
7、接下来将 i 的所有数字循环计算即可。
#include <stdio.h>
int main() {
int i, j, m, n, x;
// 遍历所有可能的i值(i和j均为偶数,且i*j=168)
for (i = 2; i <= 168; i += 2) {
if (168 % i == 0) { // 检查i是否是168的因数
j = 168 / i; // 计算对应的j
if (j % 2 == 0 && j >= 2) { // 检查j是否为偶数且>=2
// 计算m和n
m = (i + j) / 2;
n = (i - j) / 2;
// 计算x并验证条件
if (n > 0) { // 确保n是正整数
x = n * n - 100;
// 输出结果
printf("找到符合条件的数:x = %d\n", x);
printf("验证:x+100=%d(%d²),x+268=%d(%d²)\n\n",
x+100, n, x+268, m);
}
}
}
}
return 0;
}
运行结果:
找到符合条件的数:x = 21
验证:x+100=121(11²),x+268=289(17²)
找到符合条件的数:x = 261
验证:x+100=361(19²),x+268=529(23²)
找到符合条件的数:x = 1581
验证:x+100=1681(41²),x+268=1849(43²)
关键点解释
1. 为什么i和j必须是偶数?
因为 `m` 和 `n` 必须是整数。若 `i` 和 `j` 均为偶数,则 `(i + j)` 和 `(i - j)` 均为偶数,除以2后仍为整数。
2. 如何保证遍历所有可能的解?
通过遍历 `i` 的所有偶数因数(如2, 4, 6, 12等),确保覆盖所有合法的 `i` 和 `j` 组合。
3. 为何需要检查 `n > 0`?
如果 `n` 为负数,虽然数学上满足条件,但题目可能隐含要求 `x` 是正整数。若允许负解,可移除此条件。
实例4—判断某天是该年的第几天
4.题目:输入某年某月某日,判断这一天是这一年的第几天?
程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。
#include <stdio.h>
// 判断是否为闰年
int isLeapYear(int year) {
// 闰年规则:能被4整除且不能被100整除,或能被400整除
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
return 1; // 是闰年
} else {
return 0; // 不是闰年
}
}
int main() {
int year, month, day;
int sum = 0; // 存储总天数
int days_in_month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 平年每月天数
printf("请输入年 月 日(用空格分隔):");
scanf("%d %d %d", &year, &month, &day);
// 累加前month-1个月的天数
for (int i = 0; i < month - 1; i++) {
sum += days_in_month[i];
}
sum += day; // 加上当前月的天数
// 如果是闰年且月份超过2月,额外加1天
if (isLeapYear(year) && month > 2) {
sum += 1;
}
printf("这一天是%d年的第%d天。\n", year, sum);
return 0;
}
改进代码(判断日期是否合法):
#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("请输入年份、月份和日期(格式:年 月 日):");
if (scanf("%d %d %d", &year, &month, &day) != 3) {
printf("输入无效,请输入正确的年份、月份和日期。\n");
return 1;
}
// 检查年份是否合法
if (year <= 0) {
printf("年份不合法,请输入一个正整数。\n");
return 1;
}
// 检查月份是否合法
if (month < 1 || month > 12) {
printf("月份不合法,请输入1到12之间的数字。\n");
return 1;
}
// 检查日期是否合法
if (isLeapYear(year)) {
daysInMonth[1] = 29; // 闰年2月有29天
}
if (day < 1 || day > daysInMonth[month - 1]) {
printf("日期不合法,请输入有效的日期。\n");
return 1;
}
// 计算从1月1日到输入日期的天数
int totalDays = 0;
for (int i = 0; i < month - 1; i++) {
totalDays += daysInMonth[i];
}
totalDays += day; // 加上当前月份的天数
printf("%d年%d月%d日是该年的第%d天\n", year, month, day, totalDays);
return 0;
}
运行结果:
请输入年 月 日(用空格分隔):2024 3 5
这一天是2024年的第65天。
实例5—三数比大小
5.题目:输入三个整数 x、y、z,请把这三个数由小到大输出。
程序分析:我们想办法把最小的数放到 x 上,先将 x 与 y 进行比较,如果 x>y 则将 x 与 y 的值进行交换,然后再用 x 与 z 进行比较,如果 x>z 则将 x 与 z 的值进行交换,这样能使 x 最小。
#include <stdio.h>
int main() {
int x, y, z, temp; // 定义三个整数和临时变量
printf("请输入三个整数(用空格分隔):");
scanf("%d %d %d", &x, &y, &z); // 输入三个数
// 第一步:确保x是三个数中的最小值
if (x > y) { // 如果x比y大,交换x和y的值
temp = x;
x = y;
y = temp;
}
if (x > z) { // 如果x比z大,交换x和z的值
temp = x;
x = z;
z = temp;
}
// 第二步:确保y是剩下的两个数中的较小值
if (y > z) { // 如果y比z大,交换y和z的值
temp = y;
y = z;
z = temp;
}
printf("从小到大排序结果:%d %d %d\n", x, y, z);
return 0;
}
请输入三个整数(用空格分隔):8 5 2
从小到大排序结果:2 5 8
请输入三个整数(用空格分隔):3 3 1
从小到大排序结果:1 3 3
实例6—输出字母C形态
6.题目:用*号输出字母C的图案。
程序分析:可先用'*'号在纸上写出字母C,再分行输出。
#include <stdio.h>
int main() {
// 逐行输出字母C的图案
printf(" ****\n"); // 第一行:顶部横线
printf(" *\n"); // 第二行:左上角竖线
printf("*\n"); // 第三行:左竖线
printf("*\n"); // 第四行:左竖线
printf(" *\n"); // 第五行:左下角竖线
printf(" ****\n"); // 第六行:底部横线
return 0;
}
运行结果:
****
*
*
*
*
****
实例7—输出特殊字符
7.题目:输出特殊图案,请在c环境中运行,看一看,Very Beautiful!
程序分析:字符共有256个。不同字符,图形不一样。
VC6.0下出现中文乱码(原因+解决方法):
176的16进制是B0,219的16进制是DB,0xB0DB是"佰"字的内码,所以输出的就是"佰"了。
主要原因是文件信息的代码页不同,我们所使用的操作系统中文状态下的代码页,要显示扩展的ASCII码需要在437 OEM-美国这个下面显示,这样就可以显示出你所希望的。具体修改控制台的默认代码页步骤如下:
- 1.点击运行界面左上角标题栏图标【c:\】,选择默认值一项
- 2.修改默认代码页,936(ANSI/OEM-简体中文GBK)为437 OEM-美国
- 3、关闭后重新运行一下即可
-
#include<stdio.h> int main() { char a=176,b=219; 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; }
实例8—9*9乘法表
-
8.题目:输出 9*9 口诀。
-
程序分析:分行与列考虑,共 9 行 9 列,i 控制行,j 控制列。
-
#include <stdio.h> // 包含标准输入输出库,用于实现printf等输出功能 int main() { int i, j, result; // 定义三个整型变量:i控制行,j控制列,result用于存储乘法结果 printf("\n"); // 在输出前换行,使输出更美观 // 外层循环,控制行数,从1到9(i < 10) for (i = 1; i < 10; i++) { // 内层循环,控制列数,从1到当前行号i(j <= i) for (j = 1; j <= i; j++) { result = i * j; // 计算当前行号i与列号j的乘积,存储到result变量中 // 输出乘法口诀,格式为"i*j=result",并使用%-3d左对齐,宽度为3个字符 printf("%d*%d=%-3d", i, j, result); } printf("\n"); // 每完成一行的输出后换行,以便开始下一行的输出 } return 0; // 程序正常结束,返回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
实例9—国际象棋棋盘图
-
9.题目:要求输出国际象棋棋盘。
程序分析:国际象棋棋盘由64个黑白相间的格子组成,分为8行*8列。用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方格(B),还是白方格(W)。
-
#include <stdio.h> int main() { int i, j; // 定义两个变量,i控制行,j控制列 // 外层循环控制行,从1到8 for (i = 1; i <= 8; i++) { // 内层循环控制列,从1到8 for (j = 1; j <= 8; j++) { // 根据i+j的和的奇偶性来决定输出黑方格还是白方格 if ((i + j) % 2 == 0) { printf("B "); // 如果i+j的和是偶数,输出黑方格(B) } else { printf("W "); // 如果i+j的和是奇数,输出白方格(W) } } // 每输出完一行后换行 printf("\n"); } return 0; }
运行结果:
-
B W B W B W B W W B W B W B W B B W B W B W B W W B W B W B W B B W B W B W B W W B W B W B W B B W B W B W B W W B W B W B W B
实例10—笑脸打印问题
10.题目:打印楼梯,同时在楼梯上方打印两个笑脸。
程序分析:用 ASCII 1 来输出笑脸;用i控制行,j来控制列,j根据i的变化来控制输出黑方格的个数。
#include <stdio.h>
int main() {
int i, j;
// 打印两个笑脸
printf("\x01\x01\n");
// 外层循环控制行,从1到7(假设楼梯有7层)
for (i = 1; i <= 7; i++) {
// 内层循环控制列,根据行号i来决定输出的黑方格数量
for (j = 1; j <= i; j++) {
// 输出黑方格(用'*'表示)
printf("* ");
}
// 每完成一行后换行
printf("\n");
}
return 0;
}
运行结果:
☺☺
*
* *
* * *
* * * *
* * * * *
* * * * * *
* * * * * * *
转载自CSDN-专业IT技术社区
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/2502_91430041/article/details/147192813