思路:只需要9个素数,然后将连乘的部分预处理,从最大的一个连乘数开始,用n去除,倍数就是这个连乘数前面的那个数,余数继续后面的计算
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
using namespace std;
#define mst(a,b) memset(a,b,sizeof(a))
#define eps 10e-8
const int MAX_ = 10010;
const int N = 10010;
const int INF = 0x7fffffff;
const int M = 1000000000;
int prime[MAX_];
long long a[MAX_];
int b[MAX_];
int n, ok, flag;
int PrimeTable(int prime[]) { //打印素数表
int pNum=0;
prime[pNum++]=2;
for(int i=3; i<=N; i+=2) { //奇偶法
bool flag=true;
for(int j=0; prime[j]*prime[j]<=i; j++) //根号法+递归法
if(!(i%prime[j])) {
flag=false;
break;
}
if(flag)
prime[pNum++]=i;
}
return pNum;
}
int main() {
int T, cnt, p1,p2, mini, num = 1;
long long tmp =1;
cnt = PrimeTable(prime);
a[0] = 1;
for(int i = 0; i <= 9; ++i){
tmp *= prime[i];
a[num++] = tmp;
//if(tmp > M)break;
}
while(cin>>n,n) {
ok = 0;
printf("%d = ", n);
cnt = 0;
//memset()
for(int i = 9; i > -1; --i){
b[i] = n/a[i];
n %= a[i];
if(b[i])
++cnt;
}
for(int i = 0; i <= 9; ++i){
if(b[i]){
printf("%d",b[i]);
for(int j = 0; j < i; ++j){
printf("*%d",prime[j]);
}
--cnt;
if(cnt)printf(" + ");
}
}
printf("\n");
}
return 0;
}