重点:
1.数组P[101]:若i为素数,则P[i]=1,反正,P[i]=0;
2.数组primer[]:依次为每个素数,2,3,5,7,11...
3.数组result[101]:若2的指数为i,则result[2] = i;
程序先生成前两个数组,然后根据输入n,遍历i = 2,3,...,n,若其为素数,则result[i]++;反之,则依次除primer[0,1,2,...]直到为素数
代码如下:
#include <iostream>
#include <math.h>
#include <string.h>
#define N 100
int P[N+1];
int primer[N];
int result[N+1];//101
using namespace std;
void GetPrimer();
int main()
{
GetPrimer();
int n;
cin >> n;
memset(result,0,sizeof(result));
for(int i=2 ; i<=n ; i++){
if(P[i] == 1){
result[i]++;
}
else{
int j = i;
for(int k=0 ; P[j]!=1 ; ){
if(j % primer[k] == 0){
result[primer[k]] ++;
j = j / primer[k];
}
else{
k++;
}
}
result[j] ++;
}
}
int first = 1;
for(int i=0 ; i<=n ; i++){
if(result[i] != 0){
if(first == 1){
cout << n << "!=" << result[i];
first = 0;
}
else{
cout << " " << result[i];
}
}
}
cout << endl;
return 0;
}
void GetPrimer()
{
memset(P,0,sizeof(P));
P[2] = 1;
primer[0] = 2;
int index = 1;
for(int i=3 ; i<=N ; i++){
int j=2;
for( ; j<=floor(sqrt(i)+0.5) ; j++){
if(i % j == 0){
break;
}
}
if(j == floor(sqrt(i)+0.5)+1){
P[i] = 1;
primer[index++] = i;
}
}
}