您的位置:首页 > 编程语言 > Java开发

有理数的四则运算 C、java

2011-03-23 14:58 387 查看


题目:用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: 此为帮通信的那几个小朋友写的作业,

昨日耕至深夜,而知其必不知所惜,故为此篇,纪之。







内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: