不知道为啥这个答案竟然近千浏览了,emmm……牛客网《约数的个数》,更新了一下答案在最下面。
挺简单的,但还是折腾了很久。
顺序是先列质数数组,然后输入n除质数。
#include <iostream>
using namespace std;
#define MAXN 1000000
#define NUMN 20000
#define PRIN 50
int* ListPrime(int n);
int* FindPrime(int n, int *r);
void PresenPrime(int *r);
void PresenFactor(int *r);
int main() {
int n;
int* r = ListPrime(NUMN);
while (cin >> n) {
int* p = FindPrime(n, r);
PresenPrime(p);
PresenFactor(p);
delete p;
}
delete r;
system("pause");
return 0;
}
//找MAXN内前n个质数并返回数组头
int* ListPrime(int n) {
bool a[MAXN];
int* b=new int[n];
int num = 0;
long long j;
for (int i = 2; i < MAXN; i++)
a[i] = 1;
//每找到一个质数 去掉它的倍数
for (int i = 2; i < MAXN; i++) {
if (num >= n)break;
if (1 == a[i]) {
b[num++] = i;
for (j = i; i*j<MAXN; j++)