题目:用C语言、java语言实现有理数的四则运算,输入整数或小数,输出结果用分数和小数两种形式输出。
首先想到的是:有理数如何表示?
拼命、拼命回忆到了初中的数学知识——任何有理数都可以表示为分数的形式,2个整数,一个分子,一个分母。
所以表示为
//结构体 用于存储一个有理数 包含分子和分母
typedef struct Rational{
int fenzi;
int fenmu;
}Rat
还有一个问题是如何将舒服的分数或小数转化为有理数结构Rat?
如下方法getRat():
/** * 接收一个整数或小数,转化为分数形式返回 */
Rat getRat()
{
float num ;
Rat f;
scanf("%f",&num);
f.fenzi = (int)num;
f.fenmu = 1;
while(num != (int)num)
{
f.fenmu *= 10;
num *= 10;
f.fenzi = (int)num;
}
return f;
}
getRat()的作用是接受一个从键盘键入的float数值,然后将其转化为一个Rat结构返回,但不会进行化简,如输入0.5会返回的结构体分子为5分母为10.
在中间计算过程中可以有5/10这样的分数存在,但最后输出结果时肯定是要输入最简结果的,所以还必须有一个用于化简的函数——
Rat huajian(Rat n)
{
//1111111111111111111
int x = n.fenzi;
int y = n.fenmu;
if(x < y)
{//使x>y
int temp = x;
x = y;
y = temp;
}
int r = 1;
while (r)
{
r = x % y;
x = y;
y = r;
}
//2222222222222222222
/* 返回n分子分母同除以最大公约数的结果,即化简*/
Rat num;
num.fenzi = n.fenzi/x;
num.fenmu = n.fenmu/x;
return num;
//3333333333333333333
}
从//11111111 到//22222222之间的部分是一个求最大公约数的算法,执行完之后的x值即是n.fenzi和n.fenmu的最大公约数, 然后到//3333333的部分是返回化简后的Rat结构……
然后就是四则运算的函数了,如加法
/** * 加法 */
Rat jia(Rat a, Rat b)
{
Rat n;
n.fenzi = a.fenzi * b.fenmu + b.fenzi * a.fenmu;
n.fenmu = a.fenmu * b.fenmu;
return huajian(n);
}
完整代码如下: 由于编译器对C标准的支持问题,所以后缀名用了cpp。
英语不好,所以函数名暂时都是用的拼音,未及修改。
#include <cstdlib> #include <iostream> using namespace std; //结构体 用于存储一个有理数 包含分子和分母 typedef struct Rational{ int fenzi; int fenmu; }Rat; /*函数声明*/ Rat jia(Rat,Rat); Rat jian(Rat,Rat); Rat cheng(Rat,Rat); Rat chu(Rat,Rat); Rat huajian(Rat); Rat getRat(); int main(int argc, char *argv[]) { Rat a,b; Rat result; int flag; printf("请输入a值:"); a = getRat(); printf("请输入b值:"); b = getRat(); printf("/n1:加/n2:减/n3:乘/n4:除/n0:退出/n/n输入你的选择:"); while(flag) { scanf("%d",&flag); switch(flag) { case 1: result = jia(a,b); break; case 2: result = jian(a,b); break; case 3: result = cheng(a,b); break; case 4: result = chu(a,b); break; default: system("PAUSE"); return EXIT_SUCCESS; } printf("分数结果为: %d / %d ",result.fenzi,result.fenmu); printf("/n小数结果为: %f", result.fenzi / (float)result.fenmu);//打印2种结果 printf("/n/n输入你的选择:");//继续选择,直至退出 } system("PAUSE"); return EXIT_SUCCESS; } /** * 接收一个整数或小数,转化为分数形式返回 */ Rat getRat() { float num ; Rat f; scanf("%f",&num); f.fenzi = (int)num; f.fenmu = 1; while(num != (int)num) { f.fenmu *= 10; num *= 10; f.fenzi = (int)num; } return f; } /** * 化简分子分母,使之同除以最大公约数 */ Rat huajian(Rat n) { int x = n.fenzi; int y = n.fenmu; if(x < y) {//使x>y int temp = x; x = y; y = temp; } int r = 1; while (r) {//执行完毕后x即为 n.fenzi和n.fenmu的最大公约数 r = x % y; x = y; y = r; } /* 返回n分子分母同除以最大公约数的结果,即化简*/ Rat num; num.fenzi = n.fenzi/x; num.fenmu = n.fenmu/x; return num; } /** * 加法 */ Rat jia(Rat a, Rat b) { Rat n; n.fenzi = a.fenzi * b.fenmu + b.fenzi * a.fenmu; n.fenmu = a.fenmu * b.fenmu; return huajian(n); } /** * 减法 */ Rat jian(Rat a, Rat b) { Rat n; n.fenzi = a.fenzi * b.fenmu - b.fenzi * a.fenmu; n.fenmu = a.fenmu * b.fenmu; return huajian(n); } /** * 乘法 */ Rat cheng(Rat a, Rat b) { Rat n; n.fenzi = a.fenzi * b.fenzi; n.fenmu = a.fenmu * b.fenmu; return huajian(n); } /** * 除法 */ Rat chu(Rat a, Rat b) { Rat n; n.fenzi = a.fenzi * b.fenmu; n.fenmu = a.fenmu * b.fenzi; return huajian(n); }
结果示例:
java代码与此相似,完整代码为:Main.java
import java.util.Scanner; public class Main { public static void main(String[] args) { new Main(); } public Main() { Rat a = new Rat(); Rat b = new Rat(); Rat result = new Rat(); int flag = 1; System.out.print("请输入a值:"); Rat.getRat(a); System.out.print("请输入b值:"); Rat.getRat(b); System.out.print("/n1:加/n2:减/n3:乘/n4:除/n0:退出/n输入你的选择:"); while (flag != 0) { Scanner reader = new Scanner(System.in); flag = reader.nextInt(); switch (flag) { case 1: result = Rat.jia(a, b); break; case 2: result = Rat.jian(a, b); break; case 3: result = Rat.cheng(a, b); break; case 4: result = Rat.chu(a, b); break; default: System.exit(0); } System.out.print("分数结果为:" + result.fenzi + " / " + result.fenmu); float temp = result.fenzi / (float) result.fenmu; System.out.print("/n小数结果为: " + temp);// 打印2种结果 System.out.print("/n/n输入你的选择:");// 继续选择,直至退出 } } } class Rat { int fenzi = 1; int fenmu = 1; /** * 接收一个整数或小数,转化为分数形式 */ static void getRat(Rat x) { Scanner reader = new Scanner(System.in); float num = reader.nextFloat(); x.fenzi = (int) num; x.fenmu = 1; while (num != (int) num) { x.fenmu *= 10; num *= 10; x.fenzi = (int) num; } } /** * 化简分子分母,使之同除以最大公约数 */ static Rat huajian(Rat n) { int x = n.fenzi; int y = n.fenmu; if (x < y) {// 使x>y int temp = x; x = y; y = temp; } int r = 1; while (r != 0) {// 执行完毕后x即为 n.fenzi和n.fenmu的最大公约数 r = x % y; x = y; y = r; } /* 返回n分子分母同除以最大公约数的结果,即化简 */ Rat num = new Rat(); num.fenzi = n.fenzi / x; num.fenmu = n.fenmu / x; return num; } /** * 加法 */ static Rat jia(Rat a, Rat b) { Rat n = new Rat(); n.fenzi = a.fenzi * b.fenmu + b.fenzi * a.fenmu; n.fenmu = a.fenmu * b.fenmu; return huajian(n); } /** * 减法 */ static Rat jian(Rat a, Rat b) { Rat n = new Rat(); n.fenzi = a.fenzi * b.fenmu - b.fenzi * a.fenmu; n.fenmu = a.fenmu * b.fenmu; return huajian(n); } /** * 乘法 */ static Rat cheng(Rat a, Rat b) { Rat n = new Rat(); n.fenzi = a.fenzi * b.fenzi; n.fenmu = a.fenmu * b.fenmu; return huajian(n); } /** * 除法 */ static Rat chu(Rat a, Rat b) { Rat n = new Rat(); n.fenzi = a.fenzi * b.fenmu; n.fenmu = a.fenmu * b.fenzi; return huajian(n); } }
结果示例:
ps: 此为帮通信的那几个小朋友写的作业,
昨日耕至深夜,而知其必不知所惜,故为此篇,纪之。