【ACM之旅】选择计算

一、[题目] 选择计算

时间限制:1.0s   内存限制:512.0MB

问题描述

输入三个整数x,y,z。
根据z的值的不同对x和y进行计算:
z=1:输出x+y的值;
z=2:输出x-y的值;
z=3:输出x*y的值;
z=4:输出x/y的值(若除不尽取整数部分);
z=5:输出x%y的值
z=6:输出x和y的最大公约数
z=7:输出x和y的最小公倍数

输入格式

只有一行,包括三个整数,x,y,z,其中2<=x,y<=200,1<=z<=7,相邻的两个数之间用空格符隔开。

输出格式

只有一个数,表示计算后的值。

样例输入

100 80 6

样例输出

20


二、[代码]:

PS. 选择计算 是一道数学计算类题目,起涉及了基本的各种数学运算,其中较难的为除法计算、求最大公约数和最小公倍数,除法计算的关键在于判断是否除的尽,其实我们可以利用“先除再乘”来判断是否除的尽(利用除不尽输出为近似数的特点),而关于最大公约数和最小公倍数我们要把握其关系,即“最小公倍数 = 两数乘积 / 最大公约数”,而最大公约数我们利用“辗转相除法”即可得到,以下列出我的解法。


算法一: 递推函数法

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    int a, b, r, x, y, z;
    scanf("%d %d %d", &x, &y, &z); // 读入数据x,y以及计算类型z
    switch(z){   // 根据选择计算类型分支
    case 1:{ //加法
        printf("%d", x+y);
        break;
      }
    case 2:{  //减法
        printf("%d", x-y);
        break;
      }
    case 3:{  //乘法
        printf("%d", x*y);
        break;
      }
    case 4:{  //除法(判断除尽与否关键在于"先除再乘")
        char s[30];
        sprintf(s,"%.10lf", x*1.0/y); //先求出其相除后的结果保存到数组中
        double r = atof(s)*y; //再乘回去得到除数
        if(x == r) {  //判断先除再乘后的结果是否等于原除数, 相等则除尽
            int i = strlen(s);
            while(--i&&s[i]=='0') s[i] = 0; //将结果末尾多余的零去除
            printf("%s", s); //输出相除结果
        }else printf("%d",x/y); //除不尽责取整
        break;
      }
    case 5:{  //求余
        printf("%d", x%y);
        break;
      }
    default:{  //最大公约数与最小公倍数
        a = x;
        b = y;
        while(b!=0){  //辗转相除法
            r = a % b;
            a = b;
            b = r;
        }
        printf("%d", z<7?a:(x*y)/a);  //根据z进行输出
      }
    }
    return 0;
}

欢迎评论和转载,转载请注明文章出处,我对此表示最真诚的敬意!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值