mod运算的实现以及相关算法

本文探讨了取余运算的多种表达形式,如算术求模和秦九韶公式,重点介绍了如何利用秦九韶算法优化大数求模问题,并提供了C++实现。通过实例和快速幂技巧,揭示了高效计算模运算的方法,适用于编程和数学问题解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

取余运算

x % u 等价于 x - floor(x/u) * u

算术求模 mod(x, u)

x mod u 等价于 ((x % u) + x) % x

a = b x q + r (只要 b > 0 b > 0 b>0, 必有 r ≥ 0 r\ge0 r0

一个较大的数m与一个较小的数n求mod(m,n)

限制: m > > > INT_MAX, n ≤ \le INT_MAX
利用秦九韶公式写法进行思考, 123 = ( ( 0 ∗ 10 + 1 ) + 2 ) ∗ 10 ) + 3 ) ∗ 10 123 = ((0 * 10 + 1) + 2) * 10) + 3) * 10 123=((010+1)+2)10)+3)10

int mod(const string& m, int n) {
	int last = 0;
	int ans  = 0;

	for (int i = 0; i != m.size(); ++i) {
		ans = (last * 10 + (m[i] - '0')) % n;
		last = ans;
	}

	return ans;
}

幂求模 m o d ( a n , n ) mod(a^n, n) mod(an,n)

思路: 取模的等价运算, 即 ( a ∗ b ) % n (a*b) \% n (ab)%n 等价 ( a % 10 ) ∗ ( b % 10 ) (a \% 10)*(b \% 10) a%10)(b%10)

int mod(int a, int n, int m) {
	int ans = 1;

	for (int i = 0; i != n; ++i) {
		ans = (ans * a) % m;
	}

	return ans;
}

引入快速幂运算

int mod(int a, int n, int m) {
	if (n == 0) return 1;

	int tmp = mod(a, n / 2, m);

	tmp = (tmp * tmp) % m;

	if (n & 1) return (tmp * a) % m;

	return tmp;
}

迭代版本:

int mod(int a, int n, int m) {

	int ans  = 1;
	int base = a;
	for (int i = n; i > 0; i /= 2) {
		if (i & 1) ans = (ans * base) % m;
		base = (base * base) % m;
	}

	return ans;
}

大数求mod 😦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值