100 #P2260. *【模拟】分数化小数的循环节

*【模拟】分数化小数的循环节

Description

【题目描述】 
对于两个正整数 $a、b$,请计算 $a/b$ 的值,要求精确到小数点后 $n$ 位。
若小数部分不超过 $n$ 位,则输出-1;
若在这n 位内出现了一个完整的循环节,则输出这个循环节;
若在这n 位内没有除尽,也没有出现一个完整的循环节则输出 0 。 
【输入格式】 
只有一行,包含三个正整数 $a,b,n$ 。 
【输出格式】 
按题目要求输出一行结果。 

【样例1 输入】 
90 45 100 
【样例1 输出】 
-1

【样例2 输入】 
77 119 100 
【样例2 输出】 
6470588235294117 

【样例3 输入】 
335 113 19 
【样例3 输出】 


【数据范围】 
对于20%的数据点, $1 \le a,b \le 10 , 1 \le n \le 10$ 。 
对于50%的数据点, $1 \le a,b \le 10^5 , 1 \le n \le 100$ 。 
对于所有的数据点, $1 \le a,b \le 10^6 , 1\le n \le 10^4$ 。

Hint

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int s[N], len; map<int, int> mp;
int main()
{
	int a, b, n; scanf("%d%d%d", &a, &b, &n);
	if(a%b==0) {printf("-1\n"); return 0;}
	a%=b; mp.clear(); len=0;
	while(mp[a]==0 && a)
	{
		if(len>n) {printf("0\n"); return 0;}
		mp[a]=len+1;
		s[++len]=a/b;
		a=a%b*10;
	}
	if(a==0) {printf("-1\n"); return 0;}
	else 
	{
		for(int i=mp[a]; i<=len; i++)
			printf("%d", s[i]);
		printf("\n");
	}
	return 0;
}

Source

J5