关于素数的数列,高手进!a1 = 1a2 = 3a3 = 6a4 = 11a[n] - a[n - 1]是一个递增的素数序列如果a[n] > 10000, a[n] = a[n] % 10000;input noutput a[n]下面这个解法我看不懂,请高手讲解,谢谢!#include #include #define N 1000001
来源:学生作业帮助网 编辑:作业帮 时间:2024/06/30 20:14:32
![关于素数的数列,高手进!a1 = 1a2 = 3a3 = 6a4 = 11a[n] - a[n - 1]是一个递增的素数序列如果a[n] > 10000, a[n] = a[n] % 10000;input noutput a[n]下面这个解法我看不懂,请高手讲解,谢谢!#include #include #define N 1000001](/uploads/image/z/8825585-41-5.jpg?t=%E5%85%B3%E4%BA%8E%E7%B4%A0%E6%95%B0%E7%9A%84%E6%95%B0%E5%88%97%2C%E9%AB%98%E6%89%8B%E8%BF%9B%21a1+%3D+1a2+%3D+3a3+%3D+6a4+%3D+11a%5Bn%5D+-+a%5Bn+-+1%5D%E6%98%AF%E4%B8%80%E4%B8%AA%E9%80%92%E5%A2%9E%E7%9A%84%E7%B4%A0%E6%95%B0%E5%BA%8F%E5%88%97%E5%A6%82%E6%9E%9Ca%5Bn%5D+%3E+10000%2C+a%5Bn%5D+%3D+a%5Bn%5D+%25+10000%3Binput+noutput+a%5Bn%5D%E4%B8%8B%E9%9D%A2%E8%BF%99%E4%B8%AA%E8%A7%A3%E6%B3%95%E6%88%91%E7%9C%8B%E4%B8%8D%E6%87%82%2C%E8%AF%B7%E9%AB%98%E6%89%8B%E8%AE%B2%E8%A7%A3%2C%E8%B0%A2%E8%B0%A2%21%23include+%23include+%23define+N+1000001)
关于素数的数列,高手进!a1 = 1a2 = 3a3 = 6a4 = 11a[n] - a[n - 1]是一个递增的素数序列如果a[n] > 10000, a[n] = a[n] % 10000;input noutput a[n]下面这个解法我看不懂,请高手讲解,谢谢!#include #include #define N 1000001
关于素数的数列,高手进!
a1 = 1
a2 = 3
a3 = 6
a4 = 11
a[n] - a[n - 1]是一个递增的素数序列
如果a[n] > 10000, a[n] = a[n] % 10000;
input n
output a[n]
下面这个解法我看不懂,请高手讲解,谢谢!
#include
#include
#define N 1000001
#define MOD 10000
long p[50001];
bool prime[N];
long out[50001];
void get_out()
{
long i,num=0,j,k;
memset(prime,0,sizeof(prime));
out[0]=1;
for(i=2;i
关于素数的数列,高手进!a1 = 1a2 = 3a3 = 6a4 = 11a[n] - a[n - 1]是一个递增的素数序列如果a[n] > 10000, a[n] = a[n] % 10000;input noutput a[n]下面这个解法我看不懂,请高手讲解,谢谢!#include #include #define N 1000001
这个算法没什么难懂的啊,无非是利用了筛法来建素数数组而已.
筛法的原理是:假设要求从2到n之间所有的素数,可以选建一个长度为n-1的数组,初始全设为0,表示目前所有的数都是素数.然后从2开始向后遍历,每遇到一个素数(在数组中对应值为0),就将其的整数倍在数组中的对应值设为1.这样的话,第一次就删掉了所有的2的倍数,第二次删掉3的倍数,第三次删掉5的倍数(4的倍数在第一次删2的倍数时已经删掉了),第四次删掉7的倍数(6的倍数已经在删2,3的倍数时删掉了).以此类推,直到遍历结束,这时候,所有的合数已经都被筛选掉了.
程序中的
for(j=0;j=N)
break;
prime[k]=1;
}
这段,就是筛法的核心代码了.