3018 - 分数化小数
时间限制 : 1 秒
内存限制 : 128 MB
写一个程序,输入一个形如N/D的分数(N是分子,D是分母),输出它的小数形式。如果小数中有循环节的话,把循环节放在一对括号中。例如:
1/3=.33333333…写成0.(3)
41/333=0.123123123…写成0.(123)
用XXX.0表示整数
典型的转化例子:1/3=0.(3) 22/5=4.4 1/7=0.(142857) 2/2=1.0
3/8=0.375 45/56=0.803(571428)
题目输入
单独的一行包括被空格分开的N和D,1≤N,D≤100000
题目输出
输出一行,小数的表示方法上面已经说得很明白了。
输入/输出样例
输入格式
45 56
输出格式
0.803(571428)
C++解答
#include<cstdio> #include<cmath> #include<climits> #include<iostream> #include<algorithm> #include<cstring> #include<string> #include<queue> using namespace std; int N,D; int Ans[101000]={0}; int flag[100000][2]={0}; int main() { //freopen("fracdec.in","r",stdin); //freopen("fracdec.out","w",stdout); memset(flag,-1,sizeof(flag)); scanf("%d%d",&N,&D); int n=N,d=D; int str=0,end=0; n=n%d; while(n && Ans[0]<100000) { Ans[++Ans[0]]=(n*10)/d; n=(n*10)%d; if(flag[n][0]==-1) { flag[n][1]=Ans[Ans[0]]; flag[n][0]=Ans[0]; } else { if(end==0) { if(flag[n][1]==Ans[Ans[0]]) { str=flag[n][0]; end=Ans[0]; } } } } int tot=0; int c=0; if(Ans[0]==100000) { printf("%d.",N/D); for(int h=1;h<str;++h) printf("%d",Ans[h]); printf("("); for(int h=str;h<end;++h) printf("%d",Ans[h]); printf(")"); return 0; } else { if(N%D==0) { printf("%d.0",N/D); } else { printf("%d.",N/D); for(int i=1;i<=Ans[0];++i) { printf("%d",Ans[i]); } } } //fclose(stdin); //fclose(stdout); return 0; }
Python解答
# coding=utf-8 # 辗转相除法求最大公约数 def gcd(a, b): return a if b == 0 else gcd(b, a % b) # 获取小数部分和循环节 def get_decimal(numerator, denominator): remainder = numerator % denominator quotient = numerator // denominator decimal = str(quotient) + '.' remainder_map = {} i = len(decimal) while remainder != 0 and remainder not in remainder_map: remainder_map[remainder] = i i += 1 quotient, remainder = divmod(remainder * 10, denominator) decimal += str(quotient) if remainder == 0: return decimal else: repeat_start = remainder_map[remainder] return decimal[:repeat_start] + '(' + decimal[repeat_start:] + ')' # 主程序 numerator, denominator = map(int, input().split()) if numerator % denominator == 0: # 整除的情况 print(str(numerator // denominator) + '.0') else: common_divisor = gcd(numerator, denominator) numerator //= common_divisor denominator //= common_divisor print(get_decimal(numerator, denominator))