zoukankan      html  css  js  c++  java
  • PAT A1081 Rational Sum (20) [分数的四则运算]

    题目

    题目链接
    求几个分数的和

    解题思路

    1 分数存储
    2 分数化简
    3 分数打印
    4 分数运算-加

    易错点

    1 分数化简中,分子为0,分母要记得置为1
    2 加和之后记得化简
    3 最大公约数的计算使用分子分母绝对值计算,如果最大公约数为负数,化简后格式又不满足符号在分子的要求了
    4 假分数的判定为分子绝对值大于分母,因为符号在分子上

    单词语法

    denominator 分母
    numerator 分子
    range 范围
    rational numbers 有理数
    rational 理性的;合理的

    Code

    Code 01

    #include <iostream>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    // 分数存储
    struct Fraction {
    	int u;//up
    	int d;//down
    };
    
    // 最大公约数
    int gcd(int a, int b) {
    	if(b==0)return abs(a);
    	else return gcd(b,a%b);
    }
    // 分数化简
    Fraction reduction(Fraction fra) {
    	if(fra.d<0) {
    		// 分母小于0,分子分母同时变号
    		fra.d*=-1;
    		fra.u*=-1;
    	}
    	if(fra.u==0) {
    		//分子为0,分母置为1
    		fra.d=1;
    	} else {
    		// 有公约数,消去公约数
    		int gc = gcd(abs(fra.d),abs(fra.u));
    		fra.u/=gc;
    		fra.d/=gc;
    	}
    	return fra;
    }
    // 分数打印
    void show(Fraction fra) {
    	//化简
    	fra = reduction(fra);
    	//若分母为1,直接打印分子
    	if(fra.d==1)printf("%d",fra.u);
    	// 若为假分数,打印整数+真分数
    	else if(abs(fra.u)>fra.d) {
    		printf("%d %d/%d", fra.u/fra.d, abs(fra.u)%fra.d, fra.d);
    	}else {
    		printf("%d/%d", fra.u, fra.d);
    	}
    }
    // 分数相加 
    Fraction add(Fraction a, Fraction b) {
    	Fraction c;
    	c.u = a.u*b.d+a.d*b.u;
    	c.d = a.d*b.d;
    	return reduction(c);
    }
    int main(int argc,char * argv[]) {
    	int n;
    	Fraction ans;
    	scanf("%d",&n);
    	for(int i=0; i<n; i++) {
    		Fraction temp;
    		scanf("%d/%d",&temp.u,&temp.d);
    		if(i==0)ans=temp;
    		else ans = add(ans,temp); 
    	}
    	show(ans);
    	return 0;
    }
    

    Code 02

    #include <iostream>
    #include <cstdlib>
    using namespace std;
    long long gcd(long long a, long long b) {
    	return b == 0 ? abs(a) : gcd(b, a % b);
    }
    int main() {
    	long long n, a, b, suma = 0, sumb = 1, gcdvalue;
    	scanf("%lld", &n);
    	for(int i = 0; i < n; i++) {
    		scanf("%lld/%lld", &a, &b);
    		gcdvalue = gcd(a, b);
    		a = a / gcdvalue;
    		b = b / gcdvalue;
    		suma = a * sumb + suma * b;
    		sumb = b * sumb;
    		gcdvalue = gcd(suma, sumb);
    		sumb = sumb / gcdvalue;
    		suma = suma / gcdvalue;
    	}
    	long long integer = suma / sumb;
    	suma = suma - (sumb * integer);
    	if(integer != 0) {
    		printf("%lld", integer);
    		if(suma != 0) printf(" ");
    	}
    	if(suma != 0)
    		printf("%lld/%lld", suma, sumb);
    	if(integer == 0 && suma == 0)
    		printf("0");
    	return 0;
    }
    
  • 相关阅读:
    第十三章 第六小节 对象移动
    第十二章 动态内存
    Spring mybatis源码篇章-SqlSessionFactoryBean
    Spring aop使用
    Maven pom.xml简单归结
    Maven settings.xml配置解读
    Maven安装
    Tomcat部署WEB应用方式
    【Eclipse】web项目部署新手篇
    Oracle客户端工具安装
  • 原文地址:https://www.cnblogs.com/houzm/p/13339014.html
Copyright © 2011-2022 走看看