• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
jacklee404
Never Stop!
博客园    首页    新随笔    联系   管理    订阅  订阅
小数第n位-快速幂

题目链接

小数第n位

思路

考虑除法原理, 对于 \(1 / 8\) 整个过程如下:

\[1 / 8 = 0 , 1 \bmod 8 = 1 \\ 1 * 10 / 8 = 1, 10 \bmod 8 = 2 \\ 2 * 10 / 8 = 2, 20 \bmod 8 = 4 \\ 4 * 10 / 8 = 5, 40 \bmod 8 = 0 \\ \]

则对于\(\frac{a}{b}\)第\(n\)位小数可以表示为\(10 \mid ((a * 10^{n - 1}) \bmod b)\), 所以我们可以用快速幂\(O(logn)\)的解决该问题。

Code

#include <bits/stdc++.h>

using i64 = long long;

i64 a, b, n;

i64 quick_pow(i64 a, i64 b, i64 m) {
	i64 res = 1;

	while (b) {
		if (b & 1) res = res * a % m;
		a = a * a % m;
		b >>= 1;
	}	

	return res;
}

int main() {
	std::cin >> a >> b >> n;

	a = a * quick_pow(10, n - 1, b) % b;

	for (int i = 1; i <= 3; i ++) {
		a *= 10;
		
		std::cout << a / b;	

		a %= b;
	}
}
posted on 2023-06-07 13:44  Jack404  阅读(23)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3