记录编号 |
51761 |
评测结果 |
AAAAAAAAA |
题目名称 |
[USACO 2.4.5]分数化小数 |
最终得分 |
100 |
用户昵称 |
cstdio |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.009 s |
提交时间 |
2012-12-30 17:51:48 |
内存使用 |
0.32 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,d;//分子是n,分母是d
//吐槽一句:USACO题目中的变量名真心没NOIP规范......
int gcd(int x,int y){
if(x==0) return y;
return gcd(y%x,x);
}
int beforecir(void){
int d1=d;
int c2=0,c5=0;
while(d1%2==0) c2++,d1/=2;
while(d1%5==0) c5++,d1/=5;
return (c2>c5)?c2:c5;
}
int main(){
freopen("fracdec.in","r",stdin);
freopen("fracdec.out","w",stdout);
scanf("%d%d",&n,&d);
int temp,len,before;
double x;
int i;
temp=gcd(n,d);
n/=temp,d/=temp;
printf("%d.",n/d);
x=(double)n/(double)d;
if(n>=d) len=(int)ceil(log10(x))+1;
else len=2;
before=beforecir();
n%=d;
bool flag=false;
if(n==0){
printf("0\n");
goto END;
}
for(i=1;i<=before;i++){
n*=10;//长除法差不多就是这样了
printf("%d",n/d);
n%=d;
if(n==0) flag=true;
len++;
if(len%76==0) printf("\n");
}
temp=n;
if(flag) goto END;
printf("(");
do{
n*=10;
printf("%d",n/d);
n%=d;
len++;
if(len%76==0) printf("\n");
}while(n!=temp);
printf(")");
return 0;
END:;
return 0;
}