3645 - 高精度小数

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

两个数相除有时候会除不尽,于是就有了一大串小数,但是float型的有效位只有78围,就连double类型的有效

位也只有1516位。小明想知道两个整数相除小数点后第n位的数值,但他只是一个小学生,算不出来,于是找

到了你,请你编程帮他算

题目输入

每个测试案例占一行,包含三个正整数2<=a,b<=10000(分别表示被除数和除数),1<=n<=100 0000

题目输出

对于每个测试样例,要求输出a/b后的第n位小数,如果a/b没有第n位小数,则输出0

输入/输出样例

输入格式

5 3 9
198 17 4

输出格式

6
0

C语言解答

#include <stdio.h>
int main()
{
	int a,b,n,c,num,d;
	while(scanf("%d%d%d",&a,&b,&n)!=EOF)
	{
		num=0;
		c=a%b;
		while(1)
		{
			c=c*10;
			d=c/b;
			c=c%b;
			if(c==0)
			break;
			num++;
			if(num==n)
			break;
		}
		if(num==n)
		printf("%d\n",d);
		else
		printf("0\n");
	}
	return 0;
}

C++解答

#include <bits/stdc++.h>
using namespace std;
int d[1000005];
int visited[1000005];
int main()
{
	int a,b,n;
	while(~scanf("%d%d%d",&a,&b,&n)){
		memset(visited,0,sizeof(visited));
		memset(d,0,sizeof(d));
		int len=0;
		a=a%b;
		int flag=0;
		while(a>0&&len<n){
			if (visited[a]){
				flag=1;
				break;
			}
			visited[a]=1;
			a=a*10;
			d[len++]=a/b;
			a=a%b;
		}
		
		if (len==0){
			printf("0\n");
			continue;
		}
		
		n--;
		if (flag) n=n%len;
		printf("%d\n",d[n]);
	}
	return 0;
}