洛谷-数学1-基础数学问题5
P1572 计算分数题目描述Csh 被老妈关在家里做分数计算题但显然他不愿意做这么多复杂的计算。况且在家门口还有 Xxq 在等着他去一起看电影。为了尽快地能去陪 Xxq 看电影他把剩下的计算题交给了你你能帮他解决问题吗输入格式输入一行为一个分数计算式。计算式中只包含数字、、-、/。其中/为分数线分数线左边为分子右边为分母。输入数据保证不会出现繁分数。如果输入计算式的第一项为正不会有前缀号若为负会有前缀-号。所有整数均以分数形式出现。输出格式输出一行为最后的计算结果用为整数则用整数表示否则用最简分数表示。保证答案内出现的所有数如果答案是分数即为分子和分母均在 32 位带符号整数的表示范围之内。输入输出样例输入 #1复制2/11/3-1/4输出 #1复制25/12说明/提示数据范围及约定对于所有测试点输入计算式长度在 100 以内分子、分母在 1000 以内。同时保证直接从前往后直接计算分数的和或者差然后立刻化简这么做的中间结果不会超过 int 的范围。注意输入的分数不一定是最简分数。2024/2/13 添加 2 组 hack 数据。实现代码#include bits/stdc.h using namespace std; struct fs { long long fm,fz; }; fs yf(fs a) { long long m__gcd(a.fm,a.fz); a.fm/m; a.fz/m; return a; } fs jia(fs x,fs y) { long long zx.fm*y.fm; x.fz*y.fm; y.fz*x.fm; x.fmz; y.fmz; fs answer; answer.fzx.fzy.fz; answer.fmx.fm; return yf(answer); } fs jian(fs x,fs y) { long long zx.fm*y.fm; x.fz*y.fm; y.fz*x.fm; x.fmz; y.fmz; fs answer; answer.fzx.fz-y.fz; answer.fmx.fm; return yf(answer);//约分是个好习惯 } int main() { fs a,b; char ysf; scanf(%lld/%lld,a.fz,a.fm); ayf(a); cinysf; while (scanf(%lld/%lld,b.fz,b.fm)!EOF) { if (ysfEOF)break; else if (ysf){ajia(a,b);} else if (ysf-){ajian(a,b);} cinysf; } if (a.fm0a.fz0) { a.fmabs(a.fm); a.fz-a.fz*2; } if (a.fm1)couta.fz; else couta.fz/a.fm; return 0; }P4057 [Code#1] 晨跑题目描述“无体育不清华”、“每天锻炼一小时健康工作五十年幸福生活一辈子”在清华体育运动绝对是同学们生活中不可或缺的一部分。为了响应学校的号召模范好学生王队长决定坚持晨跑。不过由于种种原因每天都早起去跑步不太现实所以王队长决定每 a 天晨跑一次。换句话说假如王队长某天早起去跑了步之后他会休息 a−1 天然后第 a 天继续去晨跑并以此类推。王队长的好朋友小钦和小针深受王队长坚持锻炼的鼓舞并决定自己也要坚持晨跑。为了适宜自己的情况小钦决定每 b 天早起跑步一次而小针决定每 c 天早起跑步一次。某天早晨王队长、小钦和小针在早起跑步时相遇了他们非常激动、相互鼓励共同完成了一次完美的晨跑。为了表述方便我们把三位同学相遇的这天记为第0天。假设三位同学每次晨跑的时间段和路线都相同他们想知道下一次三人在跑步时相遇是第几天。由于三位同学都不会算所以希望由聪明的你来告诉他们答案。输入格式输入共一行包含三个正整数 a,b,c表示王队长每隔 a 天晨跑一次、小钦每隔 b 天晨跑一次且小针每隔 c 天晨跑一次。输出格式输出共一行包含一个正整数 x表示三位同学下次将在第 x 天相遇。输入输出样例输入 #1复制2 3 5输出 #1复制30输入 #2复制3 4 6输出 #2复制12输入 #3复制10 100 1000输出 #3复制1000说明/提示来自 CodePlus 2017 11 月赛清华大学计算机科学与技术系学生算法与竞赛协会 荣誉出品。Creditidea/何昊天 命题/何昊天 验题/卢政荣Git Repohttps://git.thusaac.org/publish/CodePlus201711感谢腾讯公司对此次比赛的支持。实现代码#include bits/stdc.h using namespace std; int main() { long long a,b,c; scanf(%lld%lld%lld,a,b,c); printf(%lld,a*b*c/__gcd(b,c)/__gcd(a,b*c/__gcd(b,c))); return 0; }P1414 又是毕业季II题目背景“叮铃铃铃”随着高考最后一科结考铃声的敲响三年青春时光顿时凝固于此刻。毕业的欣喜怎敌那离别的不舍憧憬着未来仍毋忘逝去的歌。一千多个日夜的欢笑和泪水全凝聚在毕业晚会上相信这一定是一生最难忘的时刻题目描述彩排了一次老师不太满意。当然啦取每位同学的号数来找最大公约数显然不太合理。于是老师给每位同学评了一个能力值。于是现在问题变为从 n 个学生中挑出 k 个人使得他们的默契程度即能力值的最大公约数最大。但因为节目太多了而且每个节目需要的人数又不知道。老师想要知道所有情况下能达到的最大默契程度是多少。这下子更麻烦了还是交给你吧~PS一个数的最大公约数即本身。输入格式第一行一个正整数 n。第二行为 n 个空格隔开的正整数表示每个学生的能力值。输出格式总共 n 行第 i 行为 ki 情况下的最大默契程度。输入输出样例输入 #1复制4 1 2 3 4输出 #1复制4 2 1 1说明/提示【题目来源】lzn 原创【数据范围】记输入数据中能力值的最大值为 inf。对于 20% 的数据n≤5inf≤103对于另 30% 的数据n≤100inf≤10对于 100% 的数据n≤104inf≤106。实现代码#includebits/stdc.h using namespace std; const int inf1e61; int n,x,sum; int t[inf]; int ans[10005]; int main(){ scanf(%d,n); for(int i1;in;i) scanf(%d,x),t[x]; for(int i1;iinf;i){ sum0; for(int j1;i*jinf;j) sumt[i*j]; ans[sum]i; } for(int in-1;i1;i--) ans[i]max(ans[i],ans[i1]); for(int i1;in;i) printf(%d\n,ans[i]); }P2651 添加括号III题目描述现在给出一个表达式形如 a1/a2/a3/.../an。如果直接计算就是一个个除过去比如 1/2/1/41/8。然而小A看到一个分数感觉很不舒服希望通过添加一些括号使其变成一个整数。一种可行的办法是 (1/2)/(1/4)2 。现在给出这个表达式求问是否可以通过添加一些括号改变运算顺序使其成为一个整数。输入格式一个测试点中会有多个表达式。第一行 t 表示表达式数量。对于每个表达式第一行是 n第二行 n 个数第 i 个数表示 ai。输出格式输出 t 行。对于每个表达式如果可以通过添加括号改变顺序使其变成整数那么输出Yes否则输出No。输入输出样例输入 #1复制2 4 1 2 1 4 5 6 5 7 9 12输出 #1复制Yes No说明/提示对于 40% 的数据n≤16。对于 70% 的数据n≤100。对于 100% 的数据 2≤n≤100001≤t≤1001≤ai≤231−1。实现代码#includebits/stdc.h using namespace std; int a[10001],t,n; int main() { cint; for(int i1;it;i) { cinna[1]a[2]; a[2]/__gcd(a[1],a[2]); for(int i3;in;i) { cina[i]; a[2]/__gcd(a[2],a[i]); } if(a[2]1) coutYesendl; else coutNoendl; } return 0; }