C语言练习 3

2023.07.26

有三个整数a,b,c,由键盘输入,输出其中的最大值。

int main()
{
    int a,b,c,max;
    printf("输入三个整数a b c\n");
    scanf("%d %d %d",&a,&b,&c);
    if (a==b)
    {
        max=a;
        if(a==c)
        {
            max=a;
            printf("最大值为max=a=b=c=%d",max);
        }
        else if(a>c)
        {
            max=a;
            printf("最大值为max=a=b=%d",max);
        }
        else
        {
            max=c;
            printf("最大值为max=c=%d",max);
        }
    }
    else if(a>b)
    {
        max=a;
        if(a==c)
        {
            max=a;
            printf("最大值为max=a=c=%d",max);
        }
        else if(a>c)
        {
            max=a;
            printf("最大值为max=a=%d",max);
        }
        else
        {
            max=c;
            printf("最大值为max=c=%d",max);
        }
    }
    else
    {
        max=b;
        if(b==c)
        {
            max=b;
            printf("最大值为max=b=c=%d",max);
        }
        else if(b>c)
        {
            max=b;
            printf("最大值为max=b=%d",max);
        }
        else
        {
            max=c;
            printf("最大值为max=c=%d",max);
        }
    }
    return 0;
}

从键盘输入一个小于1000的正数,要求输出它的平方根(如果平方根不是整数,则输出其整数部分)。要求在输入数据后先对其进行检查是否为小于1000的正数。若不是,则要求其重新输入。

int main()
{
    int num;
    double a;
    printf("输入一个小于1000的正数");
    scanf("%d",&num);
    if(num<=0||num>=1000)
    {
        printf("请重新输入一个不小于1000的正数!");
    }
    else
    {
        a=sqrt(num);
        printf("该数的平方根为%.0lf",a);
    }
    return 0;
}

给出一百分制成绩,要求输出成绩等级为‘A’、‘B’、‘C’、‘D’、‘E’。90分以上为‘A’,80~89分为‘B’,70~79分为‘C’,60~69分为‘D’,60分以下为‘E’。

int main()
{
    int score;
    printf("输入成绩为\n");
    while(scanf("%d",&score)!=EOF)
    {
    if(score>=90)
        printf("成绩等级为A\n");
    else if(score>=80)
        printf("成绩等级为B\n");
    else if(score>=70)
        printf("成绩等级为C\n");
    else if(score>=60)
        printf("成绩等级为D\n");
    else
        printf("成绩等级为E\n");
    }
    return 0;
}

给一个不多于5位的正整数,要求:

①求出它是几位数; ②分别输出每一位数; ③按逆序输出各位数字,例如原数为321,应输出123。

第①小问:使用三种循环语句书写代码

int main()
{
    int num,i=0;
    printf("输入一个不多于五位数的正整数",num);
    scanf("%d",&num);
    while(num>0)
    {
        num=num/10;
        i++;
    }
    printf("该数为%d位数。",i);
    return 0;
}

int main()
{
    int num,i=0;
    printf("输入一个不多于五位数的正整数",num);
    scanf("%d",&num);
    for(;num>0;i++)
    {
        num=num/10;
    }
    printf("该数为%d位数。",i);
    return 0;
}

int main()
{
    int num,i=0;
    printf("输入一个不多于五位数的正整数",num);
    scanf("%d",&num);
    do
    {
        num=num/10;
        i++;
    }
    while(num>0);
    printf("该数为%d位数。",i);
    return 0;
}

第②小问:

int main()
{
    int num,a,b,c,d,e;
    printf("输入一个不多于五位数的正整数",num);
    scanf("%d",&num);
    a=num%10;
    num=num/10;
    b=num%10;
    num=num/10;
    c=num%10;
    num=num/10;
    d=num%10;
    num=num/10;
    e=num%10;
    num=num/10;
    printf("个位数是%d\n",a);
    printf("十位数是%d\n",b);
    printf("百位数是%d\n",c);
    printf("千位数是%d\n",d);
    printf("万位数是%d\n",e);
    return 0;
}

第③小问:

int main()
{
    int num,a;
    printf("输入一个不多于五位数的正整数",num);
    scanf("%d",&num);
    while(num>0)
    {
        a=num%10;
        num=num/10;
        printf("%d",a);
    }
    return 0;
}

输入4个整数,按要求由小到大的顺序输出。

int main()
{
    int a,b,c,d,s;
    printf("输入4个整数:");
    scanf("%d %d %d %d",&a,&b,&c,&d);
    while(a>b||a>c||a>d)
    {
        if(a>b)
        {
            s=a;
            a=b;
            b=s;
        }
        if(a>c)
        {
            s=a;
            a=c;
            c=s;
        }
        if(a>d)
        {
            s=a;
            a=d;
            d=s;
        }
    }
    while(b>c||b>d)
    {
      if(b>c)
        {
            s=b;
            b=c;
            c=s;
        }
        if(b>d)
        {
            s=b;
            b=d;
            d=s;
        }
    }
    while(c>d)
    {
      s=c;
      c=d;
      d=s;
    }
    printf("%d %d %d %d",a,b,c,d);
    return 0;
}

关键:在思考这道题的解题逻辑时,我有想过几种办法,比如两两一组先比较,再大和大比,小和小比,剩下两数再比,再排布打印,但是这样写会出现需要考虑两数相等的情况。因此,我又思考了另一种办法,就是先假设a,b,c,d四数就是由小到大的,如果出现与此情况不太就进行两数相换的操作(学习时有学到),小于等于的情况就不需要更换,避免讨论相等的情况。

循环语句练习:

利用公式π/4 = 1-(1/3)+(1/5)-(1/7)+···求π的近似值,直到发现某一项的绝对值小于 e-6 为止(该项不累加)。

计算方法已经确定,要做的就是如何精确的执行这个公式求π值。要想使用循环来求,就需要先对公式里的项观察,找规律。

另外,写代码的过程中学习了新的函数:fabs是专门用来求绝对值的函数。

求绝对值的函数:

abs(x),求整数x的绝对值,结果为整型;fabs(x),求双精度数x的绝对值,结果是双精度型。

在使用数学函数时,要在本文件模块的开头加预处理指令:#include <math.h>。

#include <math.h>
int main()
{
    int sign=1;
    double x=1.0,PI,i=1.0,sum=0.0,e;
    while(fabs(x)>=1e-6)
    {
        x=sign/i;
        sign=-sign;
        i+=2;
        sum=sum+x;
    }
    PI=4*sum;
    printf("PI的值为%lf",PI);
    return 0;
}

求Fibonacci(斐波那契)数列的前40个数。这个数列有如下特点:第1,2两个数为1,1。从第三个数开始,该数是其前面两个数之和。即该数列为1,1,2,3,5,8,13,···。

int main()
{
    int num_1=1,num_2=1,num_3=0,i;
    printf("%d\n%d\n ",num_1,num_2);
    for(i=1;i<=38;i++)
    {
        num_3=num_2;
        num_2=num_1+num_2;
        num_1=num_3;
        printf("%d\n",num_2);
    }
    return 0;
}

输入一个大于3的整数n,判定它是否为素数(prime,又称质数)。

#include <math.h>
int main()
{
    int n,i;
    printf("输入一个大于3的整数");
    while(scanf("%d",&n)!=EOF)
    {
     for(i=2;i<=sqrt(n);i++)
     {
        if(n%i==0) break;
     }
     if(i<=sqrt(n))
         printf("该数为合数。\n");
     else
         printf("该数是质数。\n");
    }
    return 0;
}

求100~200的全部素数。

#include <math.h>
int main()
{
    int num,i;
    for(num=100;num<=200;num++)
    {
        for(i=2;i<=sqrt(num);i++)
        {
            if(num%i==0) break;
        }
        if(i>sqrt(num))
          printf("%d ",num);
    }
    return 0;
}

关键:与上一题的判断是否为素数有一些相同之处,另外的只要进行100~200之间所有数的判断,只要在外面再套一层循环语句即可。

另外:偶数不是素数,所以不必对偶数进行判定,只用对奇数进行检查。故还可以对代码进行优化,外循环变量可以从101开始,i加值为2。

优化后:

int main()
{
    int n,k,i,m=0;
    for(n=101;n<=199;n+=2)//对101到199之间的奇数进行判断即可
    {
        k=sqrt(n);
        for(i=2;i<=k;i++)
        {
            if(n%i==0) break;//如果在2到k之间有n的约数,立刻停止判断,判为合数
        }
        if(i>k)
        {
            printf("%d ",n);
            m=m+1;
        }
        if(m%10==0) printf("\n");//对一行输出数字有要求的话,可以使用一个计数变量
    }
    return 0;
}

输入两个正整数m和n,求其最大公约数和最小公倍数。

int main()
{
    int a,b,c,d,m,n;
    printf("输入两个数");
    scanf("%d %d",&a,&b);
    for(m=1;m<=a;m++)
    {
        if(a%m==0&&b%m==0)
           c=m;
    }
    for(n=1;;n++)
    {
        if(n%a==0&&n%b==0)
        {
            d=n;
            break;
        }
    }
    printf("他们的最大公约数为%d\n",c);
    printf("他们的最小公倍数为%d\n",d);
    return 0;
}

本法为穷举法,设有暂时的公约数和公倍数,因为不管是一个数的约数还是倍数,和本数之间总是存在倍数关系,求余或被求余都为0;所以运用&&符号来求两数间最大公约数,求最小公倍数的话,令内选择只成功运行一次,随即跳出循环即可。

另外,还有两种方法求最大公约数:辗转相除法和辗转相减法。

关于最大公约数和最小公倍数有这样一个公式: x*y=最小公倍数*最大公约数

这样以来求出最大公约数后就可以求出最小公倍数

辗转相除法:

int main()
{
    int a,b,c,tem;
    printf("输入两个数a b:");
    scanf("%d %d",&a,&b);
    c=a*b;
    if(a<b)
    {
        tem=a;
        a=b;
        b=tem;
    }
    while(a%b!=0)
    {
        tem=a%b;
        a=b;
        b=tem;
    }
    c=c/b;
    printf("%d为最大公约数\n",b);
    printf("%d为最小公倍数\n",c);
    return 0;
}

在写代码的过程中进行了优化,13行的 a%b==0 与 a%b!=0 两种情况,原来我是用了一个if else语句,但是学习得知,最终目的是使 a%b==0 ,所以可以先用一个while语句将所有情况下的   a%b==0 都成立,再直接进行公约数公倍数的求解,从而简化代码,运行效率更高。

辗转相减法:

int main()
{
	int a = 0,b=0,c=0,count=0;
	printf("输入两个数a b:");
	scanf("%d %d",&a,&b);
	c=a*b;
	while(a!=b)
	{
		if(a>b)
			a=a-b;
		else
			b=b-a;
	}
	c=c/b;
    printf("%d为最大公约数\n",b);
    printf("%d为最小公倍数\n",c);
	return 0;
}

大体和辗转相除法差不多,在之上进行修改即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值