第一眼看到题目发现毫无头绪 经过笔算之后发现题目中要求的过程实际上是一个辗转相除法的过程 这里以样例1进行解释
p = 103, q = 24;
被除数/除数 = 商 ~ 余数
103 / 24 = 4 ~ 7
24 / 7 = 3 ~ 3
7 / 3 = 2 ~ 1
3 / 1 = 3 (整除)
可以看到 辗转相除法是一个不断做带余除法的过程 即重复使用上一个除式的余数去除上一个除式的除数 直到余数为0
通过辗转相除法的过程 我们可以得到题目中所要求的a, b, c, d...等数字不难发现a, b, c, d等数字实际上是带余除法得到的商 即4 3 2 3
最后稍微有点卡手的是按照题目要求格式输出 我这里使用cnt1与cnt2用于计数 分别输出 "+1/{", "+1/" 以及 "}"等符号
最后输出103/24 = 4+1/{3+1/{2+1/3}}
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
void murasame() {
ll p, q, cnt1 = 0, cnt2 = 0;
cin >> p >> q;
cout << p << "/" << q << " = ";//为题目输出要求
vector <ll> ans;
while(p % q) {
ans.push_back(p / q);//将商放入ans中
p = p % q;//计算余数并赋值给原先的被除数
swap(p, q);//交换余数与除数 从而再下一次循环时进行 除数/余数
cnt1++, cnt2++;//辗转相除法过程
} ans.push_back(p / q);//以下均为按格式输出内容
if(cnt1 == 0) {
cout << p / q;
return ;
} cnt1--;
for(auto x : ans) {
cout << x;
if(cnt1 >= 0) cout << "+1/";
if(cnt1 > 0) cout << "{";
cnt1--;
} while(cnt2-- > 1) cout << "}";
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin >> T;
while(T--) {
murasame();
cout << '\n';
} return 0;
}
// 64 位输出请用 printf("%lld")

京公网安备 11010502036488号