1034 有理数四则运算 (20 分)(c语言)(测试点三)
本題要求編寫程序,計算 2 個有理數的和、差、積、商。
輸入格式:
輸入在一行中按照?a1/b1 a2/b2?的格式給出兩個分數形式的有理數,其中分子和分母全是整型范圍內的整數,負號只可能出現在分子前,分母不為 0。
輸出格式:
分別在 4 行中按照?有理數1 運算符 有理數2 = 結果?的格式順序輸出 2 個有理數的和、差、積、商。注意輸出的每個有理數必須是該有理數的最簡形式?k a/b,其中?k?是整數部分,a/b?是最簡分數部分;若為負數,則須加括號;若除法分母為 0,則輸出?Inf。題目保證正確的輸出中沒有超過整型范圍的整數。
輸入樣例 1:
2/3 -4/2結尾無空行
輸出樣例 1:
2/3 + (-2) = (-1 1/3) 2/3 - (-2) = 2 2/3 2/3 * (-2) = (-1 1/3) 2/3 / (-2) = (-1/3)結尾無空行
輸入樣例 2:
5/3 0/6結尾無空行
輸出樣例 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結尾無空行
#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編譯過不了題目中的測試點3,4,但是我改用成c++編譯器,結果就通過了
這題的思路,其實就是分解,不過我最開始分解錯了,我把它分解成了加減乘除四個,然后特別惡心,其實這道題因為就是兩個數以內的加減乘除,所以其實可以直接把它們做成約分就行,然后一個個進行處理,還有注意下首末的括號,還有個重要的思路就是把負數換成正數,不然趨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;}第二次寫這道題.發現如果顯示答案錯誤可以從輸入入手,我第二次寫這道題發現如果scanf;是%d的輸入的話,答案會顯示錯誤,應該是被截斷的原因
第三次寫,秒殺
#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); }哦,忽然記起來我寫這道題的時候有個編譯錯誤卡了我挺久的下面貼一下
嚴重性?? ?代碼?? ?說明?? ?項目?? ?文件?? ?行?? ?禁止顯示狀態
錯誤?? ?LNK2019?? ?無法解析的外部符號 "__int64 __cdecl f(int,int)" (?f@@YA_JHH@Z),函數 "void __cdecl fun1(__int64,__int64)" (?fun1@@YAX_J0@Z) 中引用了該符號?? ?Project33?? ?C:\Users\18960\source\repos\Project33\源.obj?? ?1?? ?
我用vs2019的時候出了這個錯誤,然后查了下發現是我函數聲明的時候把f函數形參聲明成了int 類型,當時我在另一個函數里的時候調用時使用的是long long類型,然后發現這種錯誤是你在調用函數的時候,你聲明的函數和實際調用的函數形參列表不一樣導致的
long long f(int a, int b); long long f(long long a,long long b) {return b == 0 ? a : f(b, a % b); }就上面這種
總結
以上是生活随笔為你收集整理的1034 有理数四则运算 (20 分)(c语言)(测试点三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java垃圾回收机制(简述)
- 下一篇: 计算机除法和取余在实际运用中的意义