### C语言100道经典例题解析 #### 程序1:组合问题 **题目**:有1、2、3、4四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? **程序分析**: 1. **分析**:对于任意一个三位数,它的每一位(百位、十位、个位)都可以从1、2、3、4中选择一个数字。但是题目要求这三个数字不能重复,因此,在确定百位数字之后,十位数字只能从剩下的三个数字中选择,而个位数字只能从剩下的两个数字中选择。 2. **实现思路**:可以通过三层嵌套循环来实现对所有可能的组合进行遍历,每次循环分别代表百位、十位和个位上的数字。在循环体内,通过判断语句来确保这三个数字互不相同。 **示例代码**: ```c 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); } ``` **解析**:这段代码使用了三层循环,分别代表百位、十位、个位。通过 `if` 条件语句确保每一次输出的三位数中的各个数字都不相同。最终得到的结果是所有符合条件的不同三位数。 #### 程序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,求应发放奖金总数? **程序分析**: 1. **分析**:此题的关键在于根据不同的利润区间计算出相应的奖金比例。需要注意的是,奖金的计算是累进式的,即较高利润区间的计算需要考虑到较低利润区间的计算结果。 2. **实现思路**:使用 `if-else` 结构,根据不同利润区间计算奖金总额。 **示例代码**: ```c main() { long int I; int bonus1 = 100000 * 0.1, bonus2, bonus4, bonus6, bonus10; scanf("%ld", &I); bonus2 = bonus1 + 100000 * 0.75; bonus4 = bonus2 + 200000 * 0.5; bonus6 = bonus4 + 200000 * 0.3; bonus10 = bonus6 + 400000 * 0.15; if (I <= 100000) { bonus = I * 0.1; } else if (I <= 200000) { bonus = bonus1 + (I - 100000) * 0.075; } else if (I <= 400000) { bonus = bonus2 + (I - 200000) * 0.05; } else if (I <= 600000) { bonus = bonus4 + (I - 400000) * 0.03; } else if (I <= 1000000) { bonus = bonus6 + (I - 600000) * 0.015; } else { bonus = bonus10 + (I - 1000000) * 0.01; } printf("bonus=%d", bonus); } ``` **解析**:代码中首先定义了各个利润区间的奖金基础值,然后根据输入的利润值,通过 `if-else` 分支结构来计算最终的奖金总额。这种累进式的计算方法确保了不同利润区间内的奖金计算正确无误。 #### 程序3:完全平方数问题 **题目**:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? **程序分析**: 1. **分析**:本题需要找到一个整数x,使得x+100和x+268都是完全平方数。解决这个问题的方法是对所有可能的x进行遍历,检查x+100和x+268是否为完全平方数。 2. **实现思路**:使用 `for` 循环遍历10万以内的整数,并使用 `sqrt` 函数计算平方根,进一步判断其是否为完全平方数。 **示例代码**: ```c #include <math.h> main() { long int i, x, y; for (i = 1; i < 100000; i++) { x = sqrt(i + 100); // x为加上100后开方后的结果 y = sqrt(i + 268); // y为再加上168后开方后的结果 if (x * x == i + 100 && y * y == i + 268) { // 如果一个数的平方根的平方等于该数,则说明此数是完全平方数 printf("\n%ld\n", i); } } } ``` **解析**:代码通过 `for` 循环遍历1至100000之间的所有整数,并使用 `sqrt` 函数计算每个数字加上100和268后的平方根。通过判断平方根的平方是否等于原数加100和加268,从而确定这些数字是否满足题目条件。 #### 程序4:日期转换问题 **题目**:输入某年某月某日,判断这一天是这一年的第几天? **程序分析**: 1. **分析**:此题主要涉及日期的转换,需要将输入的年、月、日转换为一年中的第几天。需要特别注意的是闰年和平年的影响,以及每个月的天数差异。 2. **实现思路**:通过计算输入日期之前所有月份的天数之和,并加上当月的天数即可得到该日期是一年中的第几天。对于闰年,需要额外增加一天。 **示例代码**(部分展示): ```c main() { int day, month, year, sum, leap; printf("\nplease input year, month, day\n"); scanf("%d,%d,%d", &year, &month, &day); switch (month) /* 先计算某月以前月份的总天数 */ { case 1: sum = 0; break; case 2: sum = 31; break; case 3: sum = 59; break; ... } } ``` **解析**:代码通过 `switch` 语句计算输入日期之前所有月份的总天数。针对闰年的情况,需要额外判断输入的日期是否处于3月之后,如果是,则需要额外加一天。这种方式能够准确地计算出一年中的具体日期。
剩余50页未读,继续阅读
- 粉丝: 0
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助