0


C语言100道基础拔高题(1)

1.有1,2,3,4这几个数字,问能组成多少个互不相同且无重复数字的三位数?

  1. 解题思路:首先输出由这几个数字所组成的所有三位数,接着再设置条件,使其输出的三位数不重复,下面我们来看下源代码。值得注意的是:所以题目的代码都是作者自行编写,如有更好的思路或者代码的优化,还请指出更正。
  1. #include <stdio.h>
  2. int main() {
  3. //有1,2,3,4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少
  4. //思路:首先输出所有由1,2,3,4组成的三位数,接着设置条件,只有不重复的三位数才打印出来
  5. //定义三个变量,分别表示百位,十位,个位
  6. int bai;
  7. int shi;
  8. int ge;
  9. int count = 0;
  10. //外层循环表示百位上的数,里层循环分别表示十位,个位
  11. for ( bai = 1; bai < 5; bai++) {
  12. for ( shi = 1; shi < 5; shi++) {
  13. for ( ge = 1; ge< 5; ge++) {
  14. if (bai != shi && bai != ge && shi != ge) {
  15. printf("%d%d%d\n", bai, shi, ge);
  16. count++;
  17. }
  18. }
  19. }
  20. }
  21. printf("这样不重复的三位数一共有%d\n个", count);
  22. return 0;
  23. }

2. 有一个整数加上100后是一个完全平方数,再加上168又是一个完全平方数。请问该数是多少?

  1. 解题思路:因为题目中涉及到了完全平方数,所以可以使用math库中的求平方的方法sqrt。下面我们来看下源代码:
  1. #include<stdio.h>
  2. #include<math.h>
  3. int main() {
  4. //有一个整数加上100后是一个完全平方数,再加上168又是一个完全平方数
  5. //请问该数是多少?
  6. //整体思路就是使用math库中的求平方方法sqrt
  7. int n;
  8. int num1;
  9. int num2;
  10. for (int i = 1; i < 10000; i++) {
  11. //这里使用强制转换一方面是因为num1,num2是int类型的,还有一方面就是完全平方数的结果也是整数形式的
  12. //就算有小数的平方等于i+100,在转为整数后,也会在if语句中被筛选出去
  13. num1 = (int)sqrt(i + 100);
  14. num2 = (int)sqrt(i + 268);
  15. if (num1 * num1 == i + 100 && num2 * num2 == i + 268) {
  16. n = i;
  17. break;
  18. }
  19. }
  20. printf("这个整数是%d\n", n);
  21. return 0;
  22. }

3. 输入某年某月某日,判断这一天是这一年的第几天?

  1. 解题思路:由于存在闰年和平年,所以我们需要先对输入的年份进行判断,如果是闰年则二月的天数会由28天变为29天。接着计算所输入的月份和日份距离11日过去了多少天,就是这一年的第几天。下面我们来通过代码掌握本题:
  1. int main() {
  2. //输入某年某月某日,判断这一天是这一年的第几天
  3. //首先接收键盘录入的年份,判断它是否是闰年,如果是闰年,则二月份的天数加一
  4. int year;
  5. //将一年中每一月的天数放到一个months数组当中,在下面判断闰年的时候,如果是闰年,就修改1索引处的值为29
  6. int months[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
  7. printf("请输入年份:\n");
  8. scanf("%d", &year);
  9. if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
  10. printf("该年是闰年,二月份天数加一\n");
  11. months[1] = 29;
  12. }
  13. //定义month和day两个变量用来接收用户输入的月和日
  14. int month;
  15. int day;
  16. //days变量用来存放多少天
  17. int days = 0;
  18. printf("请输入月份:\n");
  19. scanf("%d", &month);
  20. printf("请输入这是该月的几号:\n");
  21. scanf("%d", &day);
  22. //计算这一天是这一年的第几天
  23. //for循环求出这一月以前的天数
  24. for (int i = 0; i < month - 1; i++) {
  25. days += months[i];
  26. }
  27. //最后求出这一月的天数,也就是输入的日
  28. days = days + day;
  29. printf("这一天是这一年的第%d天\n", days);
  30. return 0;
  31. }

4. 输入三个整数x,y,z,并把它们按从小到大的顺序打印出来

  1. 解题思路:可以设置两个函数,分别求出最大值和最小值,接着可以利用三个整数之和减去最大值和最小值也就得到了中间值。最后按最小值,中间值,最大值的顺序打印即可。也可以设置判断条件来得到中间值。源代码如下:
  1. #include<stdio.h>
  2. int getMax(int num1, int num2);
  3. int main() {
  4. //输入三个整数x,y,z,并把它们按从小到大的顺序打印出来
  5. //首先从键盘获取到这三个整数
  6. int x;
  7. int y;
  8. int z;
  9. printf("请输入三个整数x,y,z:\n");
  10. scanf("%d,%d,%d", &x, &y, &z);
  11. //要求输入三个不一样的整数,如果有相同的则会要求重新输入
  12. while (x == y || x == z || y == z||x==y==z) {
  13. printf("请重新输入三个不一样的整数:\n");
  14. scanf("%d,%d,%d", &x, &y, &z);
  15. }
  16. //接着可以设置一个函数,该函数用来求两个数的最大值,最小值
  17. int max = getMax(x, y) > z ? getMax(x, y) : z;
  18. int min = getMin(x, y) < z ? getMin(x, y) : z;
  19. int mid;
  20. //下面便是通过判断值是否是最大值或者最小值,如果不是最大值和最小值,那么这个值就一定是中间值。
  21. if (x != max && x != min) {
  22. mid = x;
  23. }
  24. else if (y != max && y != min) {
  25. mid = y;
  26. }
  27. else {
  28. mid = z;
  29. }
  30. printf("将它们按从小到大的顺序打印结果为:%d %d %d", min, mid, max);
  31. return 0;
  32. }
  33. //得到两个数的最大值
  34. int getMax(int num1, int num2) {
  35. if (num1 > num2) {
  36. return num1;
  37. }
  38. return num2;
  39. }
  40. //得到两个数的最小值
  41. int getMin(int num1, int num2) {
  42. if (num1 < num2) {
  43. return num1;
  44. }
  45. return num2;
  46. }

5. 用符号*输出一个字母C

  1. 解题思路:可以通过自己调试来设置需要多少行的*,以及每一行需要多少个*.源代码如下所示:
  1. int main() {
  2. //用*输出一个字母C的图案
  3. int m = 5;
  4. for (int i = 0; i < m; i++) {
  5. printf("*");
  6. }
  7. printf("\n");
  8. for (int i = 0; i < m - 2; i++) {
  9. printf("*\n");
  10. }
  11. for (int i = 0; i < m; i++)
  12. {
  13. printf("*");
  14. }
  15. return 0;
  16. }

6. 输出九九乘法表

  1. 解题思路:通过观察九九乘法的结构,用一个外层循环来赋值给第一个乘数,用里层循环来赋值给第二个乘数。并用两个循环控制每一行输出的内容。下面我们来看下源代码:
  1. int main() {
  2. //输出9*9乘法表
  3. for (int i = 1; i <= 9; i++) {
  4. for (int j = 1; j <= i; j++) {
  5. printf("%d*%d=%d\t", j, i, j * i);
  6. }
  7. printf("\n");
  8. }
  9. }

7. 判断101~200之间有多少个素数?并一一列举出来

  1. 解题思路:首先确定好区间,接着判断是否是素数,素数就是一个大于1的数,除了1和它本身之外,不能被其他数整除。下面我们来看下源代码:
  1. int main() {
  2. //判断101~200之间有多少个素数,并列举出来
  3. //设置一个初始值count用来存放素数的个数
  4. int count = 0;
  5. for (int i = 101; i <= 200; i++)
  6. {
  7. //这里我们的flag需要定义在循环里面,外层循环每循环一次就给flag重新赋值
  8. //避免了因为出现一次flag=0的情况,flag就一直是0了。
  9. int flag = 1;
  10. for(int j=2;j<i;j++)
  11. {
  12. if (i % j == 0) {
  13. flag = 0; //不是素数就将flag置为0
  14. }
  15. }
  16. if (flag) { //如果是素数,则flag的值不会被修改,因此直接打印出对应的i值,就是我们要求的一个数据。
  17. printf("%d\n", i);
  18. count++;
  19. }
  20. }
  21. printf("101~200之间总共有%d个素数", count);
  22. return 0;
  23. }

8. 打印出所有的水仙花数。

  1. 解题思路:所谓的水仙花数是指一个三位数,其各位数字的立方和等于这个数的本身。我们可以通过得到这个三位数每一位上的数字,再对它进行计算判断。源代码如下:
  1. int main() {
  2. //打印出所有的水仙花数
  3. //所谓的水仙花数是指一个三位数,其各位数字的立方和等于这个数的本身
  4. //例如,153=1的三次方+5的三次方+3的三次方,所以它是水仙花数
  5. int count = 0;
  6. for (int i = 100; i < 1000; i++) {
  7. int bai = i / 100;
  8. int shi = i / 10 % 10;
  9. int ge = i % 10;
  10. if (bai * bai * bai + shi * shi * shi + ge * ge * ge == i) {
  11. printf("%d是水仙花数\n", i);
  12. count++;
  13. }
  14. }
  15. printf("一共有%d个水仙花数", count);
  16. return 0;
  17. }

9. 将一个正整数分解成质因数,例如输入90,会打印90=233*5

  1. 解题思路:首先找到能整除这个正整数的最小正数,接着重置循环初值,让它继续查找最小正数,最后将得到的所有正数放到一个数组里,最后设置好格式之后循环打印出来。源代码如下:
  1. #include<stdio.h>
  2. #include<math.h>
  3. int main() {
  4. //将一个正整数分解成质因数,例如输入90,会打印出90=2*3*3*5;
  5. int num;
  6. //定义一个count变量来记录一共有多少个质因数
  7. int count=0;
  8. //定义一个数组来存放质因数
  9. int str[10] = {0};
  10. //获取输入的正整数
  11. printf("请输入一个正整数:");
  12. scanf("%d", &num);
  13. //定义一个新变量来保存输入的正整数,防止上面的num变量值被修改,而导致输入的正整数丢失
  14. int beginnum = num;
  15. for (int i = 2; i <=num; i++) {
  16. if (num % i == 0) {
  17. num = num / i; //每得到一个质因数,就要修改num的值,继续找下一个质因数
  18. str[count] = i;
  19. count++;
  20. i = 1; //重新给i赋值,让它重新从2开始找整数的质因数
  21. }
  22. }
  23. //最后打印结果
  24. printf("%d=%d", beginnum, str[0]);
  25. for (int i = 1; i < count; i++) {
  26. printf("*%d", str[i]);
  27. }
  28. return 0;
  29. }

10. 利用条件运算符的嵌套来完成此题:学习成绩大于90分的同学用A表示,60~89分之间的用B表示,60分以下的用C表示。 (a>b)?a:b这是条件运算符的基本例子

  1. 解题思路:可以按照顺序一步一步来判断,首先判断是否大于90,如果大于就输出A;如果小于则继续判断。源代码如下:
  1. #include<stdio.h>
  2. int main() {
  3. //利用条件运算符的嵌套来完成此题:学习成绩大于90分的同学用A表示
  4. //60~89分之间的用B表示,60分以下的用C表示
  5. //(a>b)?a:b这是条件运算符的基本例子
  6. int score;
  7. printf("请输入学生的成绩:\n");
  8. scanf("%d", &score);
  9. char result=(score >= 90) ? 'A' : (score > 60) ? 'B' : (score < 60) ? 'C' : -1;
  10. printf("该学生的成绩等级为:%c", result);
  11. return 0;
  12. }

本文转载自: https://blog.csdn.net/2303_78660417/article/details/140639431
版权归原作者 小彭爱敲代码 所有, 如有侵权,请联系我们删除。

“C语言100道基础拔高题(1)”的评论:

还没有评论