【ACM之旅】选择计算

来源:互联网 发布:织梦dir安装教程 编辑:程序博客网 时间:2024/06/08 07:00

一、[题目] 选择计算

时间限制: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
原创粉丝点击