1)对于一个大数直接取模:
思想:从字符串的首位开始,对其取余,并将余数存起来与后面的相加,继续取余
<span style="font-size:18px;">//char s[1006];
int powl(char s[],int n)
{
int ans=0;
for(int i=0;i<strlen(s);i++)
ans=(ans*10+s[i]-'0')%n;
return ans;
}</span>
2)对于一些基本运算的大数取模:
加法 (a+b)%n=(a%n+b%n)%n
减法 (a-b)%n=(a%n-b%n+n)%n //为什么要加n,由于a%n可能小于b%n,所以加n保证为正整数
乘法 a*b%n=(a%n*b%n)%n
3)对于幂取模
<span style="font-size:18px;">int pow_mod(int a,int n,int m)
{
if(n==1) return a;
else
{
long long x=pow_mod(a,n/2,m);
x=(long long)x*x%m;
if(n%2==1) x=(long long)x*a%m;
return (int)x;
}
}</span>
昨天发的博客当时有点匆忙,最后的幂取模还是不太理解,今天又看了看,写了一个比较容易理解的代码
首先先说个知识点关于运算符&
&在C语言中可能表示两种运算符。
1)如果运算对象只有一个,且为右操作数,那么&为取地址运算符,结果为操作对象的地址。例如&a(假设a是一个左值,即具有具体的可访问的地址)结果为a的地址。
2)如果运算对象有两个,那么&表示位与运算。结果中的每一个二进制位等于两个运算数的对应位置的二进制位按位与。每一个位的位与运算法则是,当且仅当运算数都为1时结果为1,即:1&1==1,1&0==0 ,0&1==0 ,0&0==0。
代码如下:
int mod(int a,int n,int m)
{
int x=1;
while(n)
{
if(n&1) x=x*a%m;
n/=2;
a=a*a%m;
}
return x;
}