http://acm.bjfu.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1011
被编译器坑的我眼泪流下来,,VC6.0为毛不支持long long !!!!!!!!!!!!!!!!!!!!!!该重装系统换成visual studio了
解题思路:
输入分成两种情况进行运算
(1)有限小数
0.a1a2a3.....an的形式,直接转化为a1.......an/10^n的形式,,注意求一下最大公约数即可
(2)循环小数
0.a1a2...an(b1...bm)括号里面为循环部分
0.a1a2...an(b1...bm)=a1.....an/10^n+0.b1.....bm/10^n
0.(b1....bm)=Y
Y*1o^m=Y+b1...bm
Y即可求出
换算计算即可
把求最大公约数函数重新写一遍
int gcd(int a,int b)
'{
return b?gcd(b,a%b):a;
}
我换编译器去了
源代码:
# include <cstdio>
# include <iostream>
using
namespace
std;
# define lli long long int
lli
pow
(lli a,lli b)
{
lli res=1;
lli i;
for
(i=0;i<b;i++)
res=res*a;
return
res;
}
//????a??b????
lli gcd(lli a,lli b)
{
return
b?gcd(b,a%b):a;
}
lli turn (string b,lli length)
{
lli res=0;
int
i;
for
(i=0;b[i]!=
'\0'
;i++)
{
res=res+(b[i]-
'0'
)*
pow
(10,length-i-1);
}
return
res;
}
//??????????????????
int
main ()
{
char
a[20];
while
(
scanf
(
"%s"
,a)!=EOF)
{
getchar
();
int
i;
char
temp1[20]={
'\0'
},temp2[20]={
'\0'
};
lli fm,fn,gy;
//fm,fn????????????
int
m=0,n=0;
for
(i=2;(a[i]>=
'0'
)&&(a[i]<=
'9'
)&&(a[i]!=
'\0'
);i++)
{
temp1[i-2]=a[i];
}
temp1[i-2]=
'\0'
;
//??????????????????temp1????
char
c=a[i];
if
(a[i]==
'('
)
{
i=i+1;
int
t=0;
for
(;(a[i]>=
'0'
)&&(a[i]<=
'9'
)&&(a[i]!=
')'
);i++)
{
temp2[t]=a[i];
t++;
}
temp2[t]=
'\0'
;
}
//????????????????????temp2????
n=
strlen
(temp1);
m=
strlen
(temp2);
// printf("%s %s",temp1,temp2);
if
(m==0)
//??????????????
{
fm=turn(temp1,n);
//??????????????????
fn=
pow
(10,n);
gy=gcd(fm,fn);
printf
(
"%I64d"
,fm/gy);
printf
(
"/"
);
printf
(
"%I64d\n"
,fn/gy);
}
else
{
lli t1=0,t2=0,t3=0;
if
(n!=0)
t1=turn(temp1,n);
t2=
pow
(10,m)-1;
t3=turn(temp2,m);
//printf("%I64d ",t1);
// printf("%I64d ",t2);
// printf("%I64d ",t3);
fm=t1*t2+t3;
fn=(
pow
(10,m)-1)*
pow
(10,n);
gy=gcd(fm,fn);
printf
(
"%I64d"
,fm/gy);
printf
(
"/"
);
printf
(
"%I64d\n"
,fn/gy);
}
}
return
0;
}