【20170929】C语言每日一练

来源:互联网 发布:国外域名 批量 编辑:程序博客网 时间:2024/06/09 07:00

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

这里写图片描述

从原理可以看出,有两个循环:
1.最后的余数要等于0;——>对应一个while(r !=0)的循环
2.除数和余数的辗转相除。——>替换变量反复相除的循环

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

#include <stdio.h>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 <stdio.h>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 <stdio.h>#include <math.h>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是用户输入的数字}

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

运行结果:

这里写图片描述

原创粉丝点击