习题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