一、[题目] 选择计算
时间限制: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;
}
欢迎评论和转载,转载请注明文章出处,我对此表示最真诚的敬意!