习题1
有 1 、 2 、 3 、 4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
实现思路:
显然,这个题目需要用到循环,并且是循环嵌套,先列出所有可能的组合,再去掉重复的组合即可。
代码如下:
#include <stdio.h> int main(){ int i, j, k, n = 0; for(i = 1; i < 5; i++){ for(j = 1; j < 5; j++){ for(k = 1; k < 5; k++){ if(i != j && i != k && j != k){ n++; printf("%d%d%d", i, j, k); if(n % 5){ printf(" "); } else{ printf("\n"); } } } } } printf("\n\nThere are %d numbers.\n", n); return 0; }
打印:
123 124 132 134 142 143 213 214 231 234 241 243 312 314 321 324 341 342 412 413 421 423 431 432 There are 24 numbers.
习题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 ,求应发放奖金总数?
实现思路:
该题需要用到if条件判断或switch语句。
方式一——if语句:
#include <stdio.h> int main(){ long profit, bonus; float ratio; printf("Please input the profit:"); scanf("%ld", &profit); if(profit > 0 && profit <= 100000){ bonus = profit * 0.1; } else if(profit > 100000 && profit < 200000){ bonus = 100000 * 0.1 + (profit - 100000) * 0.075; } else if(profit >= 200000 && profit < 400000){ bonus = 100000 * 0.1 + 100000 * 0.075 + (profit - 200000) * 0.05; } else if(profit >= 400000 && profit < 600000){ bonus = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + (profit - 400000) * 0.03; } else if(profit >= 600000 && profit < 1000000){ bonus = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 200000 * 0.03 + (profit - 600000) * 0.015; } else{ bonus = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 200000 * 0.03 + 400000 * 0.015 + (profit - 1000000) * 0.01; }; printf("The bonus is %ld", bonus); return 0; }
打印:
Please input the profit:1234567 The bonus is 41845
方式二——switch语句:
#include <stdio.h> int main(){ long profit, bonus = 0; printf("Please input the profit:"); scanf("%ld", &profit); int pr = profit / 100000; if(pr > 10){ pr = 10; } switch(pr){ case 0: bonus = profit * 0.1;break; case 1: bonus = 100000 * 0.1 + (profit - 100000) * 0.075;break; case 2: case 3: bonus = 100000 * 0.1 + 100000 * 0.075 + (profit - 200000) * 0.05;break; case 4: case 5: bonus = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + (profit - 400000) * 0.03; case 6: case 7: case 8: case 9: bonus = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 200000 * 0.03 + (profit - 600000) * 0.015;break; case 10: bonus = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 200000 * 0.03 + 400000 * 0.015 + (profit - 1000000) * 0.01;break; default: printf("Input Error!!\n");break; } printf("The bonus is %ld", bonus); return 0; }
效果与方式一相同。
习题3
一个整数,它加上 100 后是一个完全平方数,再加上 168 又是一个完全平方数,请问该数是多少?
实现思路:
方式一——使用简单循环:
#include <stdio.h> #include <math.h> int main(){ int i; for(i = 0; i <= 100000; i++){ int root1 = sqrt(i + 100), root2 = sqrt(i + 268); if(pow(root1, 2) == (i + 100) && pow(root2, 2) == (i + 268)){ printf("%8d", i); } } printf("\n"); return 0; }
打印:
21 261 1581
方式二:
假设该数为 x。
则:x + 100 = n2, x + 100 + 168 = m2;
计算等式:m2 - n2 = (m + n)(m - n) = 168;
设m + n = i,m - n = j,i * j =168,i 和 j 至少一个是偶数;
可得m = (i + j) / 2, n = (i - j) / 2,因为m、n为整数,所以i 和 j 要么都是偶数、要么都是奇数;
从 3 和 4 推导可知道,i 与 j 均是大于等于 2 的偶数;
由于 i * j = 168, j>=2,则 1 < i < 168 / 2 + 1;
接下来将 i 的所有数字循环计算即可。
#include <stdio.h> int main (void) { int i, j, n, x; for (i = 1; i < 168 / 2 + 1; i++){ if (168 % i == 0){ j = 168 / i; if ( i > j && (i + j) % 2 == 0 && (i - j) % 2 == 0){ n = (i - j) / 2; x = n * n - 100; printf ("%8d", x); } } } printf("\n"); return 0; }
打印:
-99 21 261 1581
显然,此时比方式一多了一个数-99,只要在方式一中i的初始值减小为-100即可。
习题4
输入某年某月某日,判断这一天是这一年的第几天?
实现思路:
假设月份为n,则天数为前n-1个月的天数加第n月的天数,如果n大于3时,要考虑是否为闰年,如果为闰年,则2月还要多加1天。
#include <stdio.h> int main (void) { int year, month, day, days, leap = 0; printf("Please input the date(YYYY_MM-DD):"); scanf("%d-%d-%d", &year, &month, &day); switch(month){ case 1: days = 0;break; case 2: days = 31;break; case 3: days = 59;break; case 4: days = 90;break; case 5: days = 120;break; case 6: days = 151;break; case 7: days = 181;break; case 8: days = 212;break; case 9: days = 243;break; case 10: days = 273;break; case 11: days = 304;break; case 12: days = 334;break; default: printf("Input Error");break; } days += day; if(year % 4 ==0 && year % 100 != 0 || year % 400 == 0){ leap = 1; } if(leap && month > 2){ days += 1; } printf("Days = %d\n", days); return 0; }
打印:
Please input the date(YYYY_MM-DD):2020-05-26 Days = 147
习题5
输入三个整数 x、y、z ,请把这三个数由小到大输出。
实现思路:
通过两两比较找出三者中最大和最小的数。
#include <stdio.h> int main (void) { int x, y, z, temp; printf("Please input 3 numbers:\n"); scanf("%d %d %d", &x, &y, &z); if(x > y){ temp = x; x = y; y = temp; } if(x > z){ temp = x; x = z; z = temp; } if(y > z){ temp = y; y = z; z = temp; } printf("Small to big: %d %d %d", x, y, z); return 0; }
打印:
Please input 3 numbers: 12 34 23 Small to big: 12 23 34