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

CuterCorley
• 阅读 1253

给大家介绍一堂Python入门课https://www.bilibili.com/video/BV1RZ4y1n75v,感觉还不错,适合初学者入门。

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

本文原文首发来自博客专栏C语言实战,由本人转发至https://www.helloworld.net/p/wyZS57fXKCgb,其他平台均属侵权,可点击https://blog.csdn.net/CUFEECR/article/details/106478490查看原文,也可点击https://blog.csdn.net/CUFEECR浏览更多优质原创内容。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
2年前
Github标星5300+,专门为程序员开发文档开源管理系统,我粉了
!(https://oscimg.oschina.net/oscnet/a11909a041dac65b1a36b2ae8b9bcc5c432.jpg)码农那点事儿关注我们,一起学习进步!(https://oscimg.oschina.net/oscnet/f4cce1b7389cb00baaab228e455da78d0
Stella981 Stella981
2年前
Nginx反向代理upstream模块介绍
!(https://oscimg.oschina.net/oscnet/1e67c46e359a4d6c8f36b590a372961f.gif)!(https://oscimg.oschina.net/oscnet/819eda5e7de54c23b54b04cfc00d3206.jpg)1.Nginx反
Wesley13 Wesley13
2年前
1034 有理数四则运算 (20 分)
1034 有理数四则运算 (20 分)重点在对分数的处理include<iostreaminclude<cmathusingnamespacestd;//辗转相除法求最大公约数intgcd(longlonga,longlongb){
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这