/************************************************************************/ | 1365 Accepted 220K 32MS C++ 1408B 2011-06-07 13:46:59 |题意: 根据输入的算术基本定理表示整数的形式求 整数-1 的算术基本定理形式 | 按素数因子递减顺序排列 思路: 先筛32767内的素数,然后直接分解质因子即可 /************************************************************************/ #include<iostream> #include<cmath> using namespace std; const int maxn = 32768; bool isprime[maxn]; int prime[3520]; struct node { int elem; int e; }nodes[35]; //涮素数1-n int getprime(int n) { int i, j, k = 0; int s, e = (int)sqrt(n*1.0) + 1; memset(isprime, true, sizeof(isprime)); isprime[0] = isprime[1] = false; prime[k++] = 2; for(i=4; i<n; i+=2) isprime[i] = false; for(i=3; i<n; i+=2) { if(isprime[i]) { prime[k++] = i; for(s=i*2, j=i*i; j<n; j+=s) { isprime[j] = false; } } } for(; i<n; i+=2) { if(isprime[i]) prime[k++] = i; } return k; } //找到数x的质因子分解 int split(int x, int k) { int j = -1; for(int i=0; i<k; i++) { if(x%prime[i]==0) { nodes[++j].elem = prime[i]; nodes[j].e = 1; x /= prime[i]; while(x%prime[i]==0) { nodes[j].e++; x /= prime[i]; } } if(x==1) break; } return j; } int main() { int k = getprime(maxn); //printf("%d/n", k); int p, e, sum; while(true) { sum = 1; while(true) { scanf("%d", &p); if(p == 0) return 0; scanf("%d", &e); sum *= (int)pow((double)p, e); if(getchar() == '/n') break; } //printf("sum:%d",sum); int pos = split(sum-1, k); //printf("%d/n", pos); printf("%d %d", nodes[pos].elem, nodes[pos].e); for(int i=pos-1; i>=0; i--) { printf(" %d %d", nodes[i].elem, nodes[i].e); } printf("/n"); } return 0; }