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 输出】
0
【数据范围】
对于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相关
在下列比赛中: