题目
问题描述
我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。
如果我们把有限小数的末尾加上无限多个0,它们就有了统一的形式。
本题的任务是:在上面的约定下,求整数除法小数点后的第n位开始的3位数。
输入格式
一行三个整数:a b n,用空格分开。a是被除数,b是除数,n是所求的小数后位置(0<a,b,n<1000000000)
输出格式
一行3位数字,表示:a除以b,小数后第n位开始的3位数字。
输入
1 8 1
输出
125
思路
快速幂,因为(a/b)mod d = (a mod bd)/b ,所以(a/b)10^n+2 mod 1000 = (a10^n+2 mod b1000)/b,还有公式模运算的结合律:(a * b) % c = ((a % c) * (b % c)) % c
代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long ll;
ll a,b,n,mod,ans;
ll QuickMul(ll x,ll y,ll mod)//快速幂
{
ll res = 1;
while(y)
{
if(y&1) res = res*x%mod;
x = x*x%mod;
y = (y>>1);
}
return res;
}
int main()
{
scanf("%lld%lld%lld",&a,&b,&n);
mod = b*1000;
//因为(a/b)mod d = (a mod b*d)/b
// 所以 (a/b)*10^n+2 mod 1000 = (a*10^n+2 mod b*1000)/b
ans = ((a%mod)*QuickMul(10,n+2,mod)%mod)/b;//QuickMul(10,n+2,mod)求(10^n+2)mod
//都有mod因为(a * b) % c = ((a % c) * (b % c)) % c
printf("%lld\n",ans);
return 0;
}
- 总结:快速幂