蓝桥杯:小数第n位

题目

问题描述
我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。
  如果我们把有限小数的末尾加上无限多个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;
}
  • 总结:快速幂
  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值