博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【20170929】C语言每日一练
阅读量:339 次
发布时间:2019-03-04

本文共 2131 字,大约阅读时间需要 7 分钟。

【程序16】

题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
分析:首先介绍一种方法叫辗转相除法(欧几里得算法);

这里写图片描述

从原理可以看出,有两个循环:

1.最后的余数要等于0;——>对应一个while(r !=0)的循环
2.除数和余数的辗转相除。——>替换变量反复相除的循环

因为最后有用的只有b和r的值,所以可以将b的值赋给a,再将r的值赋给b。

#include 
int main(int argc, char* argv[]){ int m,n,i; int num1,num2; printf("请输入第一个正整数m:"); scanf("%d",&m); printf("请输入第二个正整数n:"); scanf("%d",&n); num1 = m; num2 = n; //注意这里要换一个变量,以便于之后用到原来的m和n的值; if(num1 > num2) { i = num1; num1 = num2; num2 = i; }//这样就保证了被除数num2 比 除数num1 大 while(num1 !=0) { i = num2 % num1; num2 = num1; num1 = i; } printf("两个数的最大公约数是:%d",num2); //最大公约数*最小公倍数 = 两个数的乘积; printf("两个数的最小公倍数是:%d",(m*n) / num2); printf("\n");}

运行结果:

【程序17】

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

#include 
int main(int argc, char* argv[]){ printf("请输入一串字符,输入回车符即止:"); int letters =0; int digits = 0; int spaces =0; int others = 0; char c; while((c=getchar()) != '\n') { if(((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z'))) { letters++; } else if((c >'0') && (c < '9')) { digits ++; } else if(c ==' ') { spaces++; } else others ++; } printf("字母有:%d,数字有:%d,空格有:%d,其他字符有:%d",letters,digits,spaces,others);}

注意:是单引号不是双引号!还有字母判断要加上等于号!

运行结果:

这里写图片描述

【程序18】

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

#include 
#include
int main(int argc, char* argv[]){ int a; int n; int i; int sum = 0; int b = 0; printf("请输入a的值:"); scanf("%d",&a); printf("请输入相加的个数:"); scanf("%d",&n); b = a; for(i = 0; i < n; i++) { if(i == 0) { sum = a; } else { a = b + a * 10 ; sum = sum +a ; } } printf("The total is %d",sum);}

作为一个小白,这个题目真是纠结了好久,每次都是输出相加的最后一个数。纠结了好久要怎样才能把前面的数给加上放到sum里面,不过终于在我仔细的分析之下给编出来了。之前写的是:

for(i = 0;i < n; i++)//其中n为相加的个数{    sum = sum + a * math.pow(10,i);//这里a是用户输入的数字}

错误在于,没有把前面的数给加进去。(其实除了这个方法,我觉得创一个数组储存每次的数,然后再加起来也行。)

运行结果:

这里写图片描述

你可能感兴趣的文章