当前位置:   article > 正文

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

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

1.求两个数的最小公倍数和最大公约数

                解题思路:求最小公倍数可以通过两个数的积再除以最大公约数来计算。而最大公约数则可以通过辗转相除法(又名欧几里得算法)来得到。源代码如下:

  1. #include<stdio.h>
  2. int main() {
  3. //程序分析:最小公倍数=两个数的积除以最大公约数
  4. //求最大公约数用辗转相除法(又名欧几里得算法)
  5. //首先获取两个数
  6. int a;
  7. int b;
  8. printf("请输入两个数:\n");
  9. scanf("%d %d", &a, &b);
  10. int a1 = a;
  11. int b1 = b;
  12. //求最大公约数,利用辗转相除法
  13. int r = a % b;
  14. while (r != 0) {
  15. a = b;
  16. b = r;
  17. r = a % b;
  18. }
  19. printf("最大公约数为:%d\n", b);
  20. //根据公式求最小公倍数
  21. printf("最小公倍数为:%d\n", (a1 * b1) / b);
  22. return 0;
  23. }

2. 输入一行字符,分别统计出其中英文字母,空格,数字和其他字符的个数。

                解题思路:通过fgets来读取字符而不使用scanf,就能够将空格的数量也算进来。

源代码如下:

  1. #include<stdio.h>
  2. #include<stdlib.h> //定义头文件,包含对字符串的一些函数
  3. #include<string.h>
  4. int main() {
  5. //输入一行字符,分别统计出其中英文字母,空格,数字和其他字符的个数
  6. char str[100];
  7. printf("请输入一行字符:\n");
  8. //使用fgets读取字符,只会在遇到换行符等少数情况下才会停止读取,并且其中的stdin表示标准输入流,它告诉fgets从键盘处读取字符并存入到str当中。
  9. // 而使用scanf的时候遇到空格就会停止读取
  10. //值得注意的是,fgets会将换行符也读取到字符串中,可以使用str[strcspn(str, "\n")] = 0来删除换行符
  11. fgets(str, sizeof(str), stdin);
  12. printf("%s", str);
  13. int englishnum = 0;
  14. int spacenum = 0;
  15. int num = 0;
  16. int another = 0;
  17. for (int i = 0; i < strlen(str); i++) {
  18. if ('a' <= str[i] && str[i] <= 'z') {
  19. englishnum++;
  20. }
  21. else if(str[i]==' ') {
  22. spacenum++;
  23. }
  24. else if ('0' <= str[i] && str[i] <= '9') {
  25. num++;
  26. }
  27. else {
  28. another++;
  29. }
  30. }
  31. printf("这一行字符中英文字符有%d个\n", englishnum);
  32. printf("这一行字符中空格字符有%d个\n", spacenum);
  33. printf("这一行字符中数组字符有%d个\n", num);
  34. printf("这一行字符中其它字符有%d个\n", another);
  35. return 0;
  36. }

3. 求s=a+aa+aaa+aaaa+aaa...aaa的值,其中a是一个数字,例如2+22+222+2222+22222(此时一共有5个数字相加),而有几个数字相加由键盘控制

                解题思路:接收输入的数字,这个数字可以作为循环的结束条件。通过观察可以知道,从第二个数开始,每一个数都是前面的数乘以10再加上输入的数字得到。源代码如下:

 

  1. #include<stdio.h>
  2. int main() {
  3. //求s=a+aa+aaa+aaaa+aaaa...aaa的值,其中a是一个数字
  4. //例如2+22+222+2222+22222(此时共有5个数字相加)
  5. //有几个数相加由键盘控制
  6. int num;
  7. printf("请输入一个数:\n");
  8. scanf("%d", &num);
  9. int result = 0;
  10. int number[100];
  11. number[0] = num;
  12. for (int i = 1; i <num; i++) {
  13. number[i] = number[i - 1] * 10 + num;
  14. }
  15. printf("s=");
  16. for (int i = 0; i < num; i++) {
  17. //printf("%d\n", number[i]);
  18. if (i == num - 1) {
  19. printf("%d", number[i]);
  20. }
  21. else {
  22. printf("%d+", number[i]);
  23. }
  24. }
  25. return 0;
  26. }

4.如果一个数恰好等于它的因子之和,这个数就称为“完数”,例如6=1+2+3。请编程找出1000以内的所有完数。

                解题思路:首先求出输入的数的所有因子,再用一个变量将这些因子全部加起来,判断是否等于原数。源代码如下:

 

  1. #include<stdio.h>
  2. int main() {
  3. //如果一个数恰好等于它的因子之和,这个数就称为"完数"
  4. //例如6=1+2+3.请编程找出1000以内的所有完数。
  5. int arr[100] = { 0 };
  6. for (int i = 1; i < 1000; i++) {
  7. int sum = 0;
  8. for (int j = 1; j < i; j++) {
  9. if (i % j == 0) {
  10. sum += j;
  11. }
  12. }
  13. if (sum == i) {
  14. printf("%d\n", i);
  15. }
  16. }
  17. }

5. 一球从100米高度自由落下,每次落地后反跳回原高度的一半再落下。求它在第10次落地时,共经过多少米?第10次反弹多高? 

                

                解题思路:第一次落地经过100米,从第二次落地开始,经过的距离为前一次落地后反弹高度的两倍。也就是说第二次落地经过的距离为50*2.依次类推,即可求出第十次落地时,一共经过多少米。源代码如下:

  1. #include<stdio.h>
  2. int main() {
  3. //一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下
  4. //求它在第10次落地时,共经过多少米?第10次反弹多高?
  5. int height = 100;
  6. int distance = height;
  7. for (int i = 2; i <= 10; i++) {
  8. height = height / 2;
  9. distance += height * 2;
  10. }
  11. printf("它在第10次落地时,共经过%d米\n", distance);
  12. printf("第十次反弹%d米",height);
  13. return 0;
  14. }

6.  猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
以后每天早上都吃了前一天剩下的一半零一个
到第10天早上再想吃的时候,发现只有一个桃子了
求第一天一共摘了多少。

                解题思路:使用逆向思维,从第十天开始往前推。源代码如下:

  1. #include<stdio.h>
  2. int main() {
  3. //猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个
  4. //第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
  5. //以后每天早上都吃了前一天剩下的一半零一个
  6. //到第10天早上再想吃的时候,发现只有一个桃子了
  7. //求第一天一共摘了多少。
  8. int num = 1;
  9. for (int i = 1; i <= 9; i++) {
  10. num = (num + 1) * 2;
  11. }
  12. printf("第一天一共摘了%d个桃子\n", num);
  13. int num1 = 1534;
  14. for (int i = 1; i <= 9; i++) {
  15. num1 = num1 / 2 - 1;
  16. }
  17. printf("到第十天只剩下%d个桃子", num1);
  18. return 0;
  19. }

7.打印出一个菱形

                解题思路:逐行打印*号,根据需要,每一行打印不同数量的*号。可以使用空格符来使菱形的形状更加像样。源代码如下:

                 

  1. #include<stdio.h>
  2. int main() {
  3. //打印出一个菱形
  4. for (int i = 1; i <= 4; i++) {
  5. //打印空格,使菱形的形状更加像样
  6. for (int k = 1; k <= 4-i; k++) {
  7. printf(" ");
  8. }
  9. //开始逐行打印数量不相同的*号
  10. for (int j = 1; j <= 1 + (i - 1) * 2; j++) {
  11. printf("*");
  12. }
  13. printf("\n");
  14. }
  15. //开始打印下半部分的*号
  16. for (int i = 1; i <= 3; i++) {
  17. for (int k = 1; k <=i; k++) {
  18. printf(" ");
  19. }
  20. for (int j = 1; j <= 5 - (i - 1) * 2; j++) {
  21. printf("*");
  22. }
  23. printf("\n");
  24. }
  25. return 0;
  26. }

8. 有一分数序列:2/1,3/2;5/3;8/5;13/8;21/13...求出这个数列的前20项之和 

                解题思路:抓住分子与分母的变化规律。前一个数的分子和分母之和是后一个数的分子。前一个数的分子是后一个数的分母。源代码如下:

  1. #include<stdio.h>
  2. int main() {
  3. //有一分数序列:2/1,3/2;5/3;8/5;13/8;21/13...
  4. //求出这个数列的前20项之和
  5. //程序分析:请抓住分子与分母的变化规律
  6. double a=1;
  7. double b=2;
  8. double result = 0;
  9. for (int i = 1; i <= 20; i++) {
  10. double sum = a + b;
  11. result += b / a; //因为/号得到的结果都是整数,我们要想结果更加精确,就得使用浮点数进行运算
  12. printf("%lf\n", result);
  13. a = b;
  14. b = sum;
  15. }
  16. printf("这个数列的前20项和为:%lf", result);
  17. }

9. 求1+2!+3!+4!+。。。+20! 

                解题思路:每一个数都是前一个数的阶乘再乘以这个数。源代码如下:

  1. #include<stdio.h>
  2. int main() {
  3. //求1+2!+3!+4!+。。。+20!
  4. int sum = 1;
  5. int result = 1;
  6. for (int i = 2; i <= 20; i++) {
  7. sum =sum * i;
  8. result = result + sum;
  9. }
  10. printf("这个运算的结果为:%d", result);
  11. }

10. 利用递归方法求5!

                解题思路:一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数。源代码如下:

  1. #include<stdio.h>
  2. int fun(int num);
  3. int main() {
  4. //利用递归方法求5!
  5. //一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数
  6. int result = fun(5);
  7. printf("!5=%d", result);
  8. return 0;
  9. }
  10. int fun(int num) {
  11. int result = 0;
  12. if (num > 1) {
  13. result = num *fun(num - 1);
  14. }
  15. else if (num == 1) {
  16. result = 1;
  17. }
  18. return result;
  19. }

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号