C语言第五章-循环结构程序设计

第五章 循环结构程序设计

1、2题都是根据流程图写代码,略

3.输人两个正整数m和n,求其最大公约数和最小公倍数(这道题重点留意)

#include <stdio.h>

//输入两个整数,求两个数的最大公约数__使用的是辗转相除法
int gcd(int m, int n)
{
    int temp;
    int mod;
    printf("m=%d,n=%d\n",m,n);
    //保证m最大
    if(m<n)
    {
        temp = m;
        m = n;
        n = temp;
    }
    printf("m=%d,n=%d\n",m,n);

    //用辗转相除法求最大公约数
    while (n!=0)
    {
        mod = m%n;
        m = n;
        n = mod;
    }
    printf("最大公约数为:%d\n",m);
    return m;
}

//输入两个整数,求两个数的最小公倍数
//注意:两个数相乘 = 两数最大公约数 * 两数最小公倍数
int lcm(int m, int n)
{
    int gcd_value;
    int lcm_value;
    gcd_value = gcd(m, n);
    lcm_value = (m*n)/gcd_value;
    printf("最小公倍数为:%d\n",lcm_value);
    return 0;
}

//输人两个正整数m和n,求其最大公约数和最小公倍数
int main()
{
    int m,n;
    int gcd_value;
    printf("请输入整数m和n,用空格隔开:\n");
    scanf("%d %d",&m,&n);
    gcd(m, n);
    lcm(m, n);
    return 0;
}

image
image

4.输人一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。

#include<stdio.h>

int main()
{
    int i;
    int letter=0,space=0,digit=0,other=0;
    char char_value;
    printf("请输入字符串:\n");

    while ((char_value = getchar()) != '\n')
    {
//        printf("char_value:%c\n",char_value);
        if((char_value>='a'&&char_value<='z')||(char_value>='A'&&char_value<='Z'))
            letter++;
        else if(char_value==' ')
            space++;
        else if(char_value>='0'&&char_value<='9')
            digit++;
        else
            other++;
    }
    printf("字母数为:%d,数字数为%d,空格数为%d,其它字符数为%d\n",letter,digit,space,other);

    return 0;
}

image

image

#include <stdio.h>
#include <math.h>

int main()
{
    int a=2;
    int n;//手动输入
    int sum=0;
    int i,next_result=0;
    printf("请输入位数n:\n");
    scanf("%d",&n);
    printf("a为:%d,n为:%d\n",a,n);

    //计算式子
    for(i=0;i<n;i++)
        {
            next_result = a * pow(10,i) + next_result;
            printf("结果next_result为:%d\n",next_result);
            sum = sum + next_result;

        }
    printf("结果sum为:%d",sum);
    return 0;
}

image

image

#include <stdio.h>

//阶乘模块
double jiecheng(int k)
{
    double result=1;
    int j;
    int n=k;
    int k_value = k;
    for(j=0;j<n;j++) //阶乘k次
    {
        result = k_value*result;
        k_value--;
    }
    printf("%d的阶乘为:%lf\n",k,result);
    return result;
}

int main()
{
    int i;
    int n=20;
    double sum=0;
    double pre_sum;

    for(i=1;i<=n;i++)
    {
        pre_sum = jiecheng(i);
        sum = sum + pre_sum;
    }
    printf("最终的结果为sum=%lf\n",sum);
    return 0;
}

image

7、
image

#include <stdio.h>
#include <math.h>

int main()
{
    double k;
    float sum1=0,sum2=0,sum3=0,sum=0;
    //第一块
    for(k=1;k<=100;k++)
    {
        sum1 = sum1 + k;
    }
    printf("sum1的值为:%f\n",sum1);
    //第2块
    for(k=1;k<=50;k++)
    {
        sum2 = sum2 + pow(k,2);
    }
    printf("sum2的值为:%f\n",sum2);
    //第3块
    for(k=1;k<=10;k++)
    {
        sum3 = sum3 + 1/k;
    }
    printf("sum3的值为:%f\n",sum3);
    //总和
    sum = sum1+sum2+sum3;
    printf("总和sum的值为:%f\n",sum);
    return 0;
}

image

8、输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是水仙花数,因为153=13+53+3^3。

#include <stdio.h>
#include <math.h>

int main()
{
    int i,j;
    int baiwei,shiwei,gewei;
    for(i=100;i<1000;i++)
    {
        //获取三位数的百位、十位、个位
        j=i;
        gewei = j%10;
        shiwei = ((j-gewei)/10)%10;  //也可以直接shiwei = (j/10)%10
        baiwei = ((((j-gewei)/10)-shiwei)/10)%10;  //也可以直接baiwei = j/100
        if(i == (pow(baiwei,3)+ pow(shiwei,3)+ pow(gewei,3)))
        {
            printf("数:%d为水仙花数\n",i);
        }
    }
    return 0;
}

image

9、一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1,2,3,而6=1+2+3,因此6是“完数”。编程序找出1000之内的所有完数,并按下面格式输出其因子:6 its factors are 1,2,3

按照提议,这里的因子应该是除了本身以外的约数了

#include <stdio.h>

int main()
{
    int i,j,k;
    int a[1000];
    int index=0;//作为数组下标
    for(i=0;i<1000;i++)//让数组元素全为0
    {
        a[i]=0;
        //printf("%d",a[i]);
    }
    printf("\n");
    int sum=1;
    //找出一个数的因子(因子不包括1和本身),1不是完数
    for(i=2;i<=1000;i++)//1-1000的数
    {
        for(j=2;j<=(i/2);j++)//从2开始,因为除以1都是本身,而本身不能算上去,最终在后面加1即可
        {
            if((i%j)==0)//判断是不是因子
            {
                if(j<=(i/j))//去掉重复的
                {
                    if(j==(i/j))//一样时只需要一个
                    {
                        //printf("数%d的因子为:%d\n",i,j);
                        a[index]=j;//保存到数组,同时下标后移一位
                        index++;
                    }
                    else//两个因子不一样时
                    {
                        //printf("数%d的因子为:%d,%d\n",i,j,i/j);
                        a[index]=j;//保存到数组,同时下标后移2位
                        a[index+1]=(i/j);
                        index++;
                        index++;
                    }
                }
            }
        }
        for(k=0;k<1000;k++)
        {
            sum = sum + a[k];
        }
        if(sum==i)//一个数如果恰好等于它的因子之和,这个数就称为“完数”
        {
            printf("数%d是完数,除本身外因子的和为:%d\n",i,sum);
            //打印
            printf("数%d its factors are:1,",i,sum);
            for(k=0;k<1000;k++)
            {
                if(a[k]!=0)
                {
                    printf("%d,",a[k]);
                }
            }
            printf("\n");

        }
        sum = 1;//和归1
        index=0;//数组下标归0
        for(k=0;k<1000;k++)//让数组元素归0
        {
            a[k]=0;
        }
    }
}

image

这里打印其实还可以排序一下,这里不搞了。而且我的方法复杂了,其实没必要把每次因子具体算出来

10、
image

#include <stdio.h>

int main()
{
    int i;
    int n=20;
    float sum=0;
    float up_value=2,load_value=1,temp;
    for(i=1;i<=n;i++)
    {
        sum=sum + up_value/load_value;
        //下一项时
        temp = load_value;
        load_value = up_value;
        up_value = up_value+temp;
    }
    printf("和sum为:%f\n",sum);
    return 0;
}

image

11、一个球从100m高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。求它在第10次落地时共经过多少米,第10次反弹多高。

#include <stdio.h>

int main()
{
    int i;
    double init_high=100;
    int rebound_time=10;//反弹次数
    double temp_high=0;
    double path=0;
    temp_high = init_high;
    for(i=1;i<=rebound_time;i++)
    {
        if(i==1)//第一次落地
        {
            path = init_high;
            printf("第%d次落地时共经过:%f米\n",i,path);
        }
        else//第二次开始直接+temp_highx2
        {
            path = path + temp_high*2;
            printf("第%d次落地时共经过:%f米\n",i,path);
        }
        temp_high = temp_high/2;
        printf("第%d次反弹高度为:%f米\n",i,temp_high);
    }
    return 0;
}

image

12、猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。求第1天共摘多少个桃子。

#include <stdio.h>

int main()
{
    int number=1;
    int flag= 1;
    int day;
    int temp;
    int last_number=1;

    //从1开始搜索,搜索到就停止
    while (flag)
    {
        temp = number;
        printf("桃子数搜索到第%d个\n",temp);
        for(day=1;day<=9;day++)
        {
            last_number = (last_number/2)-1;
            printf("第%d天吃完后桃子剩下:%d个\n",day,last_number);
        }

        if(last_number==1)//搜索到就退出
        {
            flag = 0;
        }
        else
        {
            number++;
            last_number = number;
        }
    }
    printf("第一天共摘了%d个桃子\n",temp);
    return 0;
}

image

这种方法也能做出来,直接暴力从1开始搜索。这种坏处是时间复杂度很高很高,但基本上不用什么逻辑就能实现。

方法二、书本方法,直接推出关系式子进行求解
#include <stdio.h>

int main()
{
    int day = 9;
    int prev_day_count;
    int cur_day_count = 1;
    while (day > 0)
    {
        prev_day_count = (cur_day_count + 1) * 2;
        cur_day_count = prev_day_count;
        day--;
    }
    printf("total count : %d\n", cur_day_count);
    return 0;
}

这种方法相比来说还是特别简单的,速度也快,时间复杂度小。刚开始没想这样子做~~~

image

13、

image

剩下先不做,去练一下数组先

第六章 利用数组处理批量数据

第七章 用函数实现模块化程序设计

第八章 善于利用指针

第九章 用户自己建立数据类型

第十章 对文件的输入输出

posted @ 2022-04-02 20:46  JaxonYe  阅读(182)  评论(0编辑  收藏  举报