C语言基础习题50例(四)16-20

简介: 代码如下

习题16

输入两个正整数 m 和 n ,求其最大公约数和最小公倍数。

实现思路:

求两个数的最大公约数分别采用辗转相除法、辗转相减法、枚举法得到,最小公倍数用两个数之积除以最大公约数即可获得。

方式一——辗转相除法:

思路:

(1)将两整数求余 a%b = x;

(2)如果x = 0;则b为最大公约数;

(3)如果x != 0,则 a = b、b = x,继续从1开始执行。

该循环是否继续的判断条件是x是否为0。

代码如下:

#include <stdio.h>
int main(){
    int m, n, gcd, mcm, mid;
    printf("Please input 2 numbers:\n");
    scanf("%d %d", &m, &n);
    mid = m % n;
    mcm = m * n;
    while(mid != 0){
      m = n;
      n = mid;
      mid = m % n;
  }
  gcd = n;
  mcm /= gcd;
  printf("Greatest common divisor is %d\nMinimum common multiple is %d\n", gcd, mcm);
    return 0;
}

打印:

Please input 2 numbers:
12 45
Greatest common divisor is 3
Minimum common multiple is 180

方式二——辗转相减法:

思路:

(1)如果a>b ,a = a - b;

(2)如果b>a ,b = b - a;

(3)假如a = b ,则 a或b 是最大公约数;

(4)如果a != b,则继续相减,直至a = b。

代码如下:

#include <stdio.h>
int main(){
    int m, n, gcd, mcm;
    printf("Please input 2 numbers:\n");
    scanf("%d %d", &m, &n);
    mcm = m * n;
    while(m != n){
      if(m > n){
        m -= n;
    }
    else if(m < n){
      n -= m;
    }
  }
  gcd = m;
  mcm /= gcd;
  printf("Greatest common divisor is %d\nMinimum common multiple is %d\n", gcd, mcm);
    return 0;
}

打印:

Please input 2 numbers:
18 56
Greatest common divisor is 2
Minimum common multiple is 504

方式三——枚举法:

思路:

(1)min为a、b中最小的一个数;

(2)分别用a、b对i求余数,即看是否能被整除;

(3)直到a、b同时都能被i整除;

(4)如不能整除,i加1、继续开始执行,直到i等于min。

代码如下:

#include <stdio.h>
int main(){
    int m, n, gcd, mcm, min, i;
    printf("Please input 2 numbers:\n");
    scanf("%d %d", &m, &n);
    mcm = m * n;
    min = m > n ? n : m;
    for(i = 1; i <= min; ){
      if(m % i == 0 && n % i == 0){
        gcd = i;
    }
    i++;
  }
  mcm /= gcd;
  printf("Greatest common divisor is %d\nMinimum common multiple is %d\n", gcd, mcm);    
    return 0;
}

打印:

Please input 2 numbers:
28 70
Greatest common divisor is 14
Minimum common multiple is 140

习题17

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

实现思路:

使用循环和条件判断。

代码如下:

#include <stdio.h>
int main(){
    int digit = 0, space = 0, chara = 0, other = 0;
    char inchar;    
    while((inchar = getchar()) != '\n'){
      if(inchar >= 'a' && inchar <= 'z' || inchar >= 'A' && inchar <= 'Z'){
        chara++;
    }
    else if(inchar >= '0' && inchar <= '9'){
      digit++;
    }
    else if(inchar == ' '){
      space++;
    }
    else{
      other++;
    }
  }
    printf("char = %d, digit = %d, space = %d, other = %d\n", chara, digit, space, other);
    return 0;
}

打印:

zxcvb 123 #$% ASDFG!@ #$%
char = 10, digit = 3, space = 4, other = 8

习题18

求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。

例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。

实现思路:

先计算出每一项的值,再相加。

代码如下:

#include <stdio.h>
#include <math.h>
int main(){
  int gen_num(int a, int i);
    int a, n, sum, i;
    printf("Please input a and n: ");
    scanf("%d %d", &a, &n);
    for(i = 1; i <= n; i++){
      sum += gen_num(a, i);
  }
    printf("sum = %d\n", sum);
    return 0;
}
int gen_num(int a, int i){
  int j, num = 0;
  for(j = 1; j <= i; j++){
    num += a * pow(10, j - 1);
  }
  return num;
}

打印:

Please input a and n: 3 7
sum = 3703701

习题19

一个数如果恰好等于它的因子之和,这个数就称为完数。

例如6=1 + 2 + 3,所以6是完数。

编程找出1000以内的所有完数。

实现思路:

循环和判断相结合。

代码如下:

#include<stdio.h>
#define N 1000
int main(){
    int i,j,k,n,sum;
    int a[256];
    for(i=2;i<=N;i++){
        sum=a[0]=1;
        k=0;
        for(j=2;j<=(i/2);j++){
            if(i%j==0){
                sum+=j;
                a[++k]=j;
            }            
        }
        if(i==sum){
            printf("%d=%d",i,a[0]);
            for(n=1;n<=k;n++)
                printf("+%d",a[n]);
            printf("\n");
        }        
    }
    return 0;
}

打印:

6=1+2+3
28=1+2+4+7+14
496=1+2+4+8+16+31+62+124+248

习题20

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

实现思路:

简单循环实现。

代码如下:

#include<stdio.h>
#define N 1000
int main(){
    float sum = 100, height = 100, i;
    for(i = 1; i < 10; i++){
      height /= 2.0;
      sum += (height * 2);
  }
  printf("Sum = %10.6f\nHeight = %10.6f", sum, height / 2.0);
    return 0;
}

打印:

Sum = 299.609375
Height =   0.097656
相关文章
TU^
|
6月前
|
存储 C语言
C语言习题~day35
C语言习题~day35
TU^
31 1
|
4月前
|
机器学习/深度学习 C语言
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
要保持最小的步数,每一次汉诺塔问题(无论是最初还是递归过程中的),如果此时初始柱盘子数为偶数,我们第一步是把最上面的盘子移动到中转柱,如果为奇数,我们第一步则是将其移动到目标柱。
96 0
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
TU^
|
6月前
|
编译器 C语言
C语言习题~day31
C语言习题~day31
TU^
24 2
TU^
|
6月前
|
算法 程序员 C语言
C语言习题~day36
C语言习题~day36
TU^
43 1
TU^
|
6月前
|
存储 C语言
C语言习题~day34
C语言习题~day34
TU^
34 1
TU^
|
6月前
|
算法 C语言
C语言习题~day33
C语言习题~day33
TU^
30 1
TU^
|
6月前
|
C语言
C语言习题~day32
C语言习题~day32
TU^
19 1
TU^
|
6月前
|
C语言
C语言习题~day30
C语言习题~day30
TU^
24 1
TU^
|
6月前
|
自然语言处理 C语言 C++
C语言习题~day29
C语言习题~day29
TU^
25 1
TU^
|
6月前
|
存储 C语言
C语言习题~day28
C语言习题~day28
TU^
21 1