1034 有理数四则运算 (20 分)(c语言)(测试点三)
本題要求編寫程序,計(jì)算 2 個(gè)有理數(shù)的和、差、積、商。
輸入格式:
輸入在一行中按照?a1/b1 a2/b2?的格式給出兩個(gè)分?jǐn)?shù)形式的有理數(shù),其中分子和分母全是整型范圍內(nèi)的整數(shù),負(fù)號(hào)只可能出現(xiàn)在分子前,分母不為 0。
輸出格式:
分別在 4 行中按照?有理數(shù)1 運(yùn)算符 有理數(shù)2 = 結(jié)果?的格式順序輸出 2 個(gè)有理數(shù)的和、差、積、商。注意輸出的每個(gè)有理數(shù)必須是該有理數(shù)的最簡形式?k a/b,其中?k?是整數(shù)部分,a/b?是最簡分?jǐn)?shù)部分;若為負(fù)數(shù),則須加括號(hào);若除法分母為 0,則輸出?Inf。題目保證正確的輸出中沒有超過整型范圍的整數(shù)。
輸入樣例 1:
2/3 -4/2結(jié)尾無空行
輸出樣例 1:
2/3 + (-2) = (-1 1/3) 2/3 - (-2) = 2 2/3 2/3 * (-2) = (-1 1/3) 2/3 / (-2) = (-1/3)結(jié)尾無空行
輸入樣例 2:
5/3 0/6結(jié)尾無空行
輸出樣例 2:
1 2/3 + 0 = 1 2/3 1 2/3 - 0 = 1 2/3 1 2/3 * 0 = 0 1 2/3 / 0 = Inf結(jié)尾無空行
#include<stdio.h> #include<math.h> #pragma warning (disable:4996) long long gcd(long long a, long long b); void fun(long long a, long long b); int main() {long long a1, b1, a2, b2;scanf("%lld/%lld %lld/%lld", &a1, &b1, &a2, &b2);fun(a1, b1); printf(" + "); fun(a2, b2); printf(" = "); fun(a1 * b2 + a2 * b1, b1 * b2); putchar('\n');fun(a1, b1); printf(" - "); fun(a2, b2); printf(" = "); fun(a1 * b2 - a2 * b1, b1 * b2); putchar('\n');fun(a1, b1); printf(" * "); fun(a2, b2); printf(" = "); fun(a1*a2, b1 * b2); putchar('\n');fun(a1, b1); printf(" / "); fun(a2, b2); printf(" = "); fun(a1 * b2, a2 * b1);return 0;} long long gcd(long long a, long long b) {return b == 0 ? a : gcd(b, a % b); } void fun(long long a, long long b) {if (a * b == 0) {printf("%s", a == 0 ? "0" : "Inf");return;}int flag = a > 0 && b < 0 || a < 0 && b>0;printf("%s", flag ? "(-" : "");a = abs(a); b = abs(b);int k = a / b;if (k != 0) {printf("%d", k);}if (a % b == 0) {printf("%s", flag ? ")" : "");return;}printf("%s", k != 0 ? " " : "");long long yueshu = gcd(a, b);a /= yueshu; b /= yueshu;printf("%lld/%lld%s",a%b,b, flag ? ")" : "");return; }這題目很神奇,我用c編譯過不了題目中的測試點(diǎn)3,4,但是我改用成c++編譯器,結(jié)果就通過了
這題的思路,其實(shí)就是分解,不過我最開始分解錯(cuò)了,我把它分解成了加減乘除四個(gè),然后特別惡心,其實(shí)這道題因?yàn)榫褪莾蓚€(gè)數(shù)以內(nèi)的加減乘除,所以其實(shí)可以直接把它們做成約分就行,然后一個(gè)個(gè)進(jìn)行處理,還有注意下首末的括號(hào),還有個(gè)重要的思路就是把負(fù)數(shù)換成正數(shù),不然趨0取余可以把你逼瘋
#include<iostream> #include<string> using namespace std; #include<cmath> #include<algorithm> #pragma warning (disable:4996) long long gcd(long long a, long long b); void fun(long long a, long long b); int main() {long long a1, b1, a2, b2;scanf("%lld/%lld %lld/%lld", &a1, &b1, &a2, &b2);fun(a1, b1); printf(" + "); fun(a2, b2); printf(" = "); fun(a1 * b2 + a2 * b1, b1 * b2); cout << "\n";fun(a1, b1); printf(" - "); fun(a2, b2); printf(" = "); fun(a1 * b2 - a2 * b1, b1 * b2); cout << "\n";fun(a1, b1); printf(" * "); fun(a2, b2); printf(" = "); fun(a1 * a2, b1 * b2); cout << "\n";fun(a1, b1); printf(" / "); fun(a2, b2); printf(" = "); fun(a1 * b2, a2 * b1); cout << "\n"; } long long gcd(long long a, long long b) {if (b == 0)return a;else gcd(b, a % b); } void fun(long long a, long long b) {if (a * b == 0) {cout << (a == 0 ? "0" : "Inf");return;}bool flag = a > 0 && b < 0 || a < 0 && b>0;if (flag) {cout << "(-";a = abs(a);b = abs(b);}long long zhengshu = a / b;if (zhengshu != 0) {cout << zhengshu;}if (a % b == 0) {cout << (flag == 1 ? ")" : "");return;}else{cout << (zhengshu != 0 ? " " : "");long long yueshu = gcd(a, b);a /= yueshu; b /= yueshu;a %= b;printf("%lld/%lld", a, b);cout << (flag == 1 ? ")" : "");}return;}第二次寫這道題.發(fā)現(xiàn)如果顯示答案錯(cuò)誤可以從輸入入手,我第二次寫這道題發(fā)現(xiàn)如果scanf;是%d的輸入的話,答案會(huì)顯示錯(cuò)誤,應(yīng)該是被截?cái)嗟脑?/p>
第三次寫,秒殺
#include<iostream> using namespace std; #include<string> #include<algorithm> #pragma warning (disable:4996) #include <climits> #include <vector> #include<stack> long long f(long long a, long long b); void fun1(long long a, long long b); int main() {long long a1, b1, a2, b2;scanf("%lld/%lld %lld/%lld", &a1, &b1, &a2, &b2);fun1(a1, b1); printf(" + "); fun1(a2, b2); printf(" = "); fun1(a1 * b2 + a2 * b1, b1 * b2); putchar('\n');fun1(a1, b1); printf(" - "); fun1(a2, b2); printf(" = "); fun1(a1 * b2 - a2 * b1, b1 * b2); putchar('\n');fun1(a1, b1); printf(" * "); fun1(a2, b2); printf(" = "); fun1(a1 * a2, b1 * b2); putchar('\n');fun1(a1, b1); printf(" / "); fun1(a2, b2); printf(" = "); fun1(a1 * b2, a2 * b1); putchar('\n'); } void fun1(long long a, long long b) {if (a * b == 0) {printf("%s", a == 0 ? "0" : "Inf");return;}bool flag = a > 0 && b < 0 || a < 0 && b>0;if (flag) {cout << "(-";a = abs(a);b = abs(b);}long long zhengshu = a / b;if (zhengshu != 0)cout << zhengshu;if (zhengshu != 0 && a % b != 0)cout << " ";if (a % b != 0) {long long gongyuehsu = f(a, b);a /= gongyuehsu;b /= gongyuehsu;cout << a % b << "/" << b;}if (flag)cout << ")";return;} long long f(long long a,long long b) {return b == 0 ? a : f(b, a % b); }哦,忽然記起來我寫這道題的時(shí)候有個(gè)編譯錯(cuò)誤卡了我挺久的下面貼一下
嚴(yán)重性?? ?代碼?? ?說明?? ?項(xiàng)目?? ?文件?? ?行?? ?禁止顯示狀態(tài)
錯(cuò)誤?? ?LNK2019?? ?無法解析的外部符號(hào) "__int64 __cdecl f(int,int)" (?f@@YA_JHH@Z),函數(shù) "void __cdecl fun1(__int64,__int64)" (?fun1@@YAX_J0@Z) 中引用了該符號(hào)?? ?Project33?? ?C:\Users\18960\source\repos\Project33\源.obj?? ?1?? ?
我用vs2019的時(shí)候出了這個(gè)錯(cuò)誤,然后查了下發(fā)現(xiàn)是我函數(shù)聲明的時(shí)候把f函數(shù)形參聲明成了int 類型,當(dāng)時(shí)我在另一個(gè)函數(shù)里的時(shí)候調(diào)用時(shí)使用的是long long類型,然后發(fā)現(xiàn)這種錯(cuò)誤是你在調(diào)用函數(shù)的時(shí)候,你聲明的函數(shù)和實(shí)際調(diào)用的函數(shù)形參列表不一樣導(dǎo)致的
long long f(int a, int b); long long f(long long a,long long b) {return b == 0 ? a : f(b, a % b); }就上面這種
總結(jié)
以上是生活随笔為你收集整理的1034 有理数四则运算 (20 分)(c语言)(测试点三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java垃圾回收机制(简述)
- 下一篇: 计算机除法和取余在实际运用中的意义