模运算举例:
6265 % 133
= 62 * 6264 % 133
= 62 * (622)32 % 133
= 62 * 384432 % 133
= 62 * (3844 % 133)32 % 133
= 62 * 12032 % 133
= 62 * 3616 % 133
= 62 * 998 % 133
= 62 * 924 % 133
= 62 * 852 % 133
= 62 * 43 % 133
= 2666 % 133
= 6
HDU-2035代码:
#include<stdio.h>
int head;
int pan(int x,int y)
{
if(y==0)return 1;
if(y==1)return x%1000;
if(y%2!=0)head=head*x%1000;
return pan(x*x%1000,y/2);
}
int main()
{
int m,n,s;
while(scanf("%d%d",&m,&n)&&(m||n))
{
head=1;
s=pan(m,n);
printf("%d\n",s*head%1000);
}
return 0;
}
至今还未发现什么高级点的素数计算方法。现在最常用的也就是筛选法,不过效率太低,数组一大就不适应了。
筛选法:就是标记数组中可以被2整除的,然后标记可以被3整除的,一直标记到可以n整除的,没被标记的就是素数。
HDU OJ 1262 代码
#include<stdio.h>
int main()
{
int s[10001];
int i,n,j;
for(i=0;i<10001;i++)
s[i]=1;
for(i=2;i<=10000;i++)
{
if(s[i]==1)
{
for(j=2;j<i;j++)
{
if(i!=j&&i%j==0)
{
s[i]=0;
break;
}
}
}
}
while(scanf("%d",&n)&&n)
{
int leap=0;
for(i=(n-1)/2;i>=2;i--)
{
if(s[i]==1&&s[n-i]==1)
leap++;
}
printf("%d\n",leap);
}
return 0;
}