【20170929】C语言每日一练

【程序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是用户输入的数字

}

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

运行结果:

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值