3018 - 分数化小数

通过次数

0

提交次数

0

时间限制 : 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))