日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

1034 有理数四则运算 (20 分)(c语言)(测试点三)

發(fā)布時(shí)間:2024/4/18 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1034 有理数四则运算 (20 分)(c语言)(测试点三) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本題要求編寫程序,計(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。