记录编号 51761 评测结果 AAAAAAAAA
题目名称 [USACO 2.4.5]分数化小数 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 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;
}