zoukankan      html  css  js  c++  java
  • [PAT] A1088 Rational Arithmetic

    题目大意

    给出两个分数,求加减乘除的结果。

    思路

    求最大公约数要用辗转相除法,否则会超时。
    判断符号不能两数相乘,因为乘积可能超过long long范围。

    tips

    题目说了输入格式一定是a1/b1 a2/b2,所以直接输入即可,不用字符串来转(在这里耗了好多时间和代码...555...我真傻,真的。)

    AC代码

    #define _CRT_SECURE_NO_WARNINGS
    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    int gcd(int a, int b) {
    	return b == 0 ? a : gcd(b, a % b);
    }
    void huajian(long long int fenzi, long long int fenmu) {
    	if (fenmu == 0) {
    		printf("Inf"); return;
    	}
    	if (fenzi == 0) {
    		printf("0"); return;
    	}
    	bool fuhao = 1;
    	if ((fenzi < 0 && fenmu > 0) || (fenzi > 0 && fenmu < 0))fuhao = 0;
    	if (fuhao == false)printf("(-");
    	if (abs(fenzi) >= abs(fenmu)) {//假分数,先求出整数部分
    		printf("%lld", abs(fenzi / fenmu));
    		fenzi = fenzi % fenmu;
    		if (fenzi != 0)printf(" ");
    	}
    	if (fenzi != 0) {
    		long long k = gcd(abs(fenzi), abs(fenmu));
    		fenzi = fenzi / k;fenmu = fenmu / k;
    		printf("%lld/%lld", abs(fenzi), abs(fenmu));
    	}
    	if (fuhao == false)printf(")");
    }
    int main() {
    	long long int a1, b1, a2, b2;
    	scanf("%lld/%lld %lld/%lld", &a1, &b1, &a2, &b2);
    	huajian(a1, b1);printf(" + ");huajian(a2, b2);printf(" = ");
    	huajian(a1 * b2 + a2 * b1, b1 * b2);printf("
    ");
    	huajian(a1, b1);printf(" - ");huajian(a2, b2);printf(" = ");
    	huajian(a1 * b2 - a2 * b1, b1 * b2);printf("
    ");
    	huajian(a1, b1);printf(" * ");huajian(a2, b2);printf(" = ");
    	huajian(a1 * a2, b1 * b2);printf("
    ");
    	huajian(a1, b1);printf(" / ");huajian(a2, b2);printf(" = ");
    	huajian(a1 * b2, b1 * a2);printf("
    ");
    	return 0;
    }
    

    傻傻的代码,删了可惜QAQ...

    #define _CRT_SECURE_NO_WARNINGS
    #include<cstdio>
    #include<iostream>
    #include<string>
    #include<map>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    struct node {
    	long long int fenzi, fenmu;
    	node() {
    		fenzi = 0; fenmu = 0;
    	}
    };
    int gcd(int a, int b) {
    	return b == 0 ? a : gcd(b, a % b);
    }
    void huajian(long long int fenzi, long long int fenmu) {
    	if (fenmu == 0) {
    		printf("Inf"); return;
    	}
    	if (fenzi == 0) {
    		printf("0"); return;
    	}
    	bool fuhao = 1;
    	if ((fenzi < 0 && fenmu > 0) || (fenzi > 0 && fenmu < 0))fuhao = 0;
    	if (fuhao == false)printf("(-");
    	if (abs(fenzi) >= abs(fenmu)) {//假分数,先求出整数部分
    		printf("%lld", abs(fenzi / fenmu));
    		fenzi = fenzi % fenmu;
    		if (fenzi != 0)printf(" ");
    	}
    	if (fenzi != 0) {
    		long long k = gcd(abs(fenzi), abs(fenmu));
    		fenzi = fenzi / k;fenmu = fenmu / k;
    		printf("%lld/%lld", abs(fenzi), abs(fenmu));
    	}
    	if (fuhao == false)printf(")");
    }
    int main() {
    	node op[2];
    	for (int i = 0;i < 2;i++) {
    		string stemp;
    		int flag = true;//负数是0
    		cin >> stemp;
    		if (stemp[0] == '-') {
    			flag = false;
    			stemp.erase(stemp.begin());
    		}
    		int j = 0;
    		while (stemp[j] != '/' && j < stemp.size()) {
    			op[i].fenzi = op[i].fenzi * 10 + stemp[j] - '0';
    			j++;
    		}
    		if (flag == false)op[i].fenzi = -op[i].fenzi;
    		if (j == stemp.size())op[i].fenmu = 1;
    		j++;
    		while (j < stemp.size()) {
    			op[i].fenmu = op[i].fenmu * 10 + stemp[j] - '0';
    			j++;
    		}
    	}
    	huajian(op[0].fenzi, op[0].fenmu);printf(" + ");huajian(op[1].fenzi, op[1].fenmu);printf(" = ");
    	huajian(op[0].fenzi * op[1].fenmu + op[1].fenzi * op[0].fenmu, op[0].fenmu * op[1].fenmu);printf("
    ");
    	huajian(op[0].fenzi, op[0].fenmu);printf(" - ");huajian(op[1].fenzi, op[1].fenmu);printf(" = ");
    	huajian(op[0].fenzi * op[1].fenmu - op[1].fenzi * op[0].fenmu, op[0].fenmu * op[1].fenmu);printf("
    ");
    	huajian(op[0].fenzi, op[0].fenmu);printf(" * ");huajian(op[1].fenzi, op[1].fenmu);printf(" = ");
    	huajian(op[0].fenzi * op[1].fenzi, op[0].fenmu * op[1].fenmu);printf("
    ");
    	huajian(op[0].fenzi, op[0].fenmu);printf(" / ");huajian(op[1].fenzi, op[1].fenmu);printf(" = ");
    	huajian(op[0].fenzi * op[1].fenmu, op[0].fenmu * op[1].fenzi);printf("
    ");
    	return 0;
    }
    
  • 相关阅读:
    原生JS实现new方法、new一个对象发生的四部、new里面常用的优先级
    svg image标签降级技术
    ReflectionToStringBuilder使用
    记一次未解决的异常:java.lang.NoClassDefFoundError: net/sf/json/JSONObject
    eclipse安装Run-Jetty-Run插件,修改实时生效
    jdbcTemplate:包含占位符的SQL无法打印参数信息
    jdbcTemplate异常:like模糊查询报错(Parameter index out of range (1 > number of parameters)
    Spring整合MyBatis
    springmvc整合slf4j、log4j记录文本日志
    Java环境配置
  • 原文地址:https://www.cnblogs.com/yue36/p/13363045.html
Copyright © 2011-2022 走看看