标签:nyoj131
给你两个个小数,你能计算出它们的和是多少吗?
你肯定会说,so easy。
可是,如果这些小数中有的是无限循环小数呢?
无限循环小数一般有三部分,整数部分,小数不循环部分,和小数循环部分。
比如:
1.2(34)的三部分分别为1 2 34.
2.(04)的整数部分为2,小数不循环部分不存在,小数循环部分为04
2.4的整数部分为2,小数不循环部分为4,小数循环部分不存在
一般小数循环部分在小数的最后。
现在,请计算两个无限循环小数的和
3 1 $ 3 2 $ 3 0 1 3 0 $ 6 2 03 $ 2 4 $
11/3 4/5 443/100
#include <stdio.h>
#include <string.h>
#define maxn 22
typedef long long LL;
char S[maxn], T[maxn], R[maxn];
int t;
LL a[2], b[2], c[3];
void getData(LL arr[]) {
scanf("%s%s%s", S, T, R);
if(S[0] == '$') S[0] = '0';
sscanf(S, "%lld", &c[0]);
if(R[0] == '$') {
if(T[0] == '$') {
arr[0] = c[0]; arr[1] = 1;
} else {
strcat(S, T);
sscanf(S, "%lld", &arr[0]);
LL tmp = 1;
int len = strlen(T);
for(int i = 0; i < len; ++i)
tmp *= 10;
arr[1] = tmp;
}
} else {
if(T[0] == '$') {
strcat(S, R);
sscanf(S, "%lld", &arr[0]);
int len = strlen(R);
LL tmp = 1;
for(int i = 0; i < len; ++i)
tmp *= 10;
arr[0] -= c[0];
arr[1] = tmp - 1;
} else {
strcat(S, T);
sscanf(S, "%lld", &c[1]);
strcat(S, R);
sscanf(S, "%lld", &c[2]);
int len = strlen(T);
LL tmp = 1;
for(int i = 0; i < len; ++i)
tmp *= 10;
LL tmp2 = tmp; len = strlen(R);
for(int i = 0; i < len; ++i)
tmp2 *= 10;
arr[0] = c[2] - c[1];
arr[1] = tmp2 - tmp;
}
}
}
LL gcd(LL x, LL y) {
return y ? gcd(y, x % y) : x;
}
void solve() {
c[0] = a[0] * b[1] + a[1] * b[0];
c[1] = a[1] * b[1];
if(c[0] % c[1] == 0) {
printf("%lld\n", c[0] / c[1]);
return;
}
LL tmp = gcd(c[0], c[1]);
c[0] /= tmp; c[1] /= tmp;
printf("%lld/%lld\n", c[0], c[1]);
}
int main() {
// freopen("stdin.txt", "r", stdin);
scanf("%d", &t);
while(t--) {
getData(a);
getData(b);
solve();
}
return 0;
}标签:nyoj131
原文地址:http://blog.csdn.net/chang_mu/article/details/40208883