重点:快速幂、位运算、递归
详解:
快速幂:
目的:快速解决很大的数关于某一个数的取模,从而减少时空的复杂度;
方法:分层次的累乘,每次乘以多余的数;
步骤:
1).确定幂的奇偶性:b%2==1或b&1==1均可;
2).将整除数依次累乘:a=(a*a)%c;
3).将次幂数减半:b/=2;
4).判断次幂数是否为0,为0跳出循环,不为0继续返回指行循环体;
样例:这里我们采用调用函数的形式:
Int Pow1(int ,int ,int );
5的10的18次关于1007取模
int pow1(int a,int b,int c)
{
int ans;
a=a%c;
while(b>0)
{
if(b%2==1)
{
ans=(ans*a)%c;
}
b/=2;
a=(a*a)%c;
}
return ans ;
}
递归:
目的:解决重复的计算问题;通过所传的参数不同,达到预期的效果;
样例:
1).阶乘
#include<stdio.h>
int fact(int n);
Int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
printf("%d\n",fact(n));
}
return 0;
}
int fact (int n)
{
int f;
if(n==1)
return 1;
else{
f=(fact(n-1)+1)*2;
return f;
}
}
2).杨辉三角
#include<stdio.h>
int a[40][40];
int f(int x,int y)
{
if(y==1||y==x)
return 1;
if(a[x][y])
return a[x][y];
return a[x][y]=f(x-1,y-1)+f(x-1,y);
}
int main()
{
int n,i,j;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
{
for(j=1;j<i;j++)
printf("%d ",f(i,j));
printf("%d\n",f(i,j));
}
printf("\n");
}
return 0;
}