1 solutions
-
0
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))
- 1
Information
- ID
- 17480
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By