英文题读不懂题==质数幂的形式给你一个数 把它减一再用质数幂的形式表示出来
*解法:质数从小到大模拟除一遍,输入有点别扭
#include <iostream> #include <cstdio> #include <cstring> using namespace std; #define SZ 33005 char a[100]; bool isprime[SZ]; int primes[SZ], num[SZ]; int cnt; void prime(int n) { memset(isprime, 1, sizeof(isprime));//1->是素数,0->不是素数 memset(primes, 0, sizeof(primes)); isprime[0] = 0; isprime[1] = 0; cnt = 0; for(int i = 2; i <= n; i++)//========高亮!i<=n!高亮========= { if(!isprime[i]) continue; primes[cnt++] = i; for(int j = i * i ; j <= n; j += i)//========高亮!j<=n!高亮========= isprime[j] = 0; } //cnt:n以内有cnt个质数 return; } int main() { while(1) { int n = 0, tmp1 = 0, tmp2 = 0, ans = 1; gets(a); int len = strlen(a); for(int i = 0; i <= len; i++) { if(a[0] == ‘0‘) return 0;//等于0的时候终止 可以直接写return 0 if(a[i] == ‘ ‘ || a[i] == ‘\0‘) { if(n % 2 == 1) { for(int j = 0; j < tmp2; j++) ans *= tmp1; tmp1 = 0, tmp2 = 0; } n++; if(a[i] == ‘ ‘) continue; else break; } if(n % 2 == 0) tmp1 = tmp1 * 10 + a[i] - ‘0‘; else tmp2 = tmp2 * 10 + a[i] - ‘0‘; } ans -= 1; prime(ans);//求ans内的质数 memset(num, 0, sizeof(num)); int j = 0; while(j < cnt) { if(ans % primes[j] == 0) { num[j]++; ans /= primes[j]; } else j++; if(ans == 1) break; } for(int i = cnt - 1; i >= 0; i--) { if(!num[i]) continue; printf("%d %d ", primes[i], num[i]); } printf("\n"); } return 0; }