思路:只需要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; }