当前位置: 代码迷 >> 综合 >> 【ACM之旅】选择计算
  详细解决方案

【ACM之旅】选择计算

热度:16   发布时间:2024-01-20 22:06:01.0

一、[题目] 选择计算

时间限制: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以及计算类型zswitch(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;
}

欢迎评论和转载,转载请注明文章出处,我对此表示最真诚的敬意!
  相关解决方案