PAT A1059 Prime Factors
Sample Input:
97532468
Sample Output:
97532468=2^2*11*17*101*1291
word | meaning |
---|---|
exponent | n. 指数 |
-
题意:
将N分解质因数 -
思路1:
- 一个数n不可能有2个以上大于sqrt(n)的因子(因为:sqrt(n)^2 = n…)-> 见下面 case3
- 将小于sqrt(n)的质数找出来,放到数组
Prime[]
中待枚举 - 一个因子包括2部分(因子p,因子个数k),可以用一个结构体数组保存
- 从2开始,枚举Prime[]中的元素,如果
Prime[i]
是n的因子(while(n % Prime[i] == 0)
),记录下p后,用n 不断除这个因子,每运算一次k++(因子Prime[i]的个数),直到不满足while - 枚举完,以后按格式输出
注意:
case1: 1要单独处理
case2: 一个数没有因子(即没有执行while循环),也要单独处理
case3: 有因子 > sqrt(n),即while循环执行完n!=0,把这个额外的因子单独加进去
- code1:
#include <cstdio>
#include <math.h>
using namespace std;
const int maxn = 100010;
int Prime[maxn], Num = 0;
bool P[maxn] = {0};
struct factor{
int p, k = 0;
}f[110];
void findPrime(int n){
//记录不大于n的质数
for(int i = 2; i <= n; ++i){
if(!P[i]){
Prime[Num++] = i;
for(int j = i + i; j <= n; j += i){
P[j] = true;
}
}
}
}
void outPut(int j){
for(int i = 0; i < j; ++i){
if(f[i].k != 1)
printf("%d^%d", f[i].p, f[i].k);
else
printf("%d", f[i].p);
if(i < j-1){
printf("*");
}
}
}
int main(){
int n;
scanf("%d", &n);
int sqr = (int)sqrt(1.0*n);
findPrime(sqr);
if(n == 1) printf("%d=%d", n, n); //case1
else{
printf("%d=", n);
int fNum = 0; //因子数
for(int i = 0; i < Num; ++i){
while(n % Prime[i] == 0){
//判断Prime[i]是否是n的质因数
f[fNum].p = Prime[i];
f[fNum].k++;
n /= Prime[i];
if(n % Prime[i] != 0)
fNum++;
}
if(n == 1) break; //提前退出循环,节省时间
}
if(fNum == 0){
//case2
printf("%d", n);
}
else{
if(n != 1){
//case3zh
f[fNum].p=n; f[fNum++].k++; //注意j++:
}
outPut(fNum);
}
}
return 0;
}
- T2 code:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000010;
vector<int> prime;
bool p[maxn];
struct Factor{
int f, cnt;
}fac[10];
void GetPrime(int n){
for(int i = 2; i <= n; ++i){
if(p[i] == false){
prime.push_back(i);
for(int j = i + i; j < maxn; j += i){
p[j] = true;
}
}
}
}
int idex = 0;
void GetFactor(int n){
int sqr = sqrt(1.0 * n);
GetPrime(sqr);
for(int i = 0; i < prime.size(); ++i){
if(n % prime[i] == 0){
while(n % prime[i] == 0){
fac[idex].f = prime[i];
fac[idex].cnt++;
n /= prime[i];
}
idex++;
}
}
if(n != 1){
fac[idex].f = n;
fac[idex++].cnt = 1;
}
}
int main(){
int n;
scanf("%d", &n);
GetFactor(n);
printf("%d=", n);
if(n == 1) printf("1"); //判特:n = 1,输出 1 = 1; 样例3!
else{
for(int i = 0; i < idex; ++i){
printf("%d", fac[i].f);
if(fac[i].cnt > 1) printf("^%d", fac[i].cnt);
if(i < idex-1) printf("*");
}
}
return 0;
}
- T3 code:
#include <bits/stdc++.h>
using namespace std;
vector<int> Prime;
unordered_map<int, bool> p;
void GetPrime(int n)
{
int sqr = sqrt(1.0*n);
for(int i = 2; i <= sqr; ++i)
{
if(p[i] == false)
{
Prime.push_back(i);
for(int j = i + i; j <= sqr; j += i)
{
p[j] = true;
}
}
}
}
struct Fac
{
int factor, num;
}fac[15];
int idex = 0;
void GetFactor(int n)
{
for(int i = 0; i < Prime.size() && n > Prime[i]; ++i)
{
if(n % Prime[i] == 0)
{
while(n % Prime[i] == 0)
{
fac[idex].factor = Prime[i];
fac[idex].num++;
n /= Prime[i];
}
idex++;
}
}
if(n > 1)
{
fac[idex].factor = n;
fac[idex].num = 1;
idex++;
}
}
void PrintFactor()
{
for(int i = 0; i < idex; ++i)
{
printf("%d", fac[i].factor);
if(fac[i].num != 1)
{
printf("^%d", fac[i].num);
}
if(i < idex - 1) printf("*");
}
}
int main()
{
int n;
scanf("%d", &n);
if(n == 1)
{
printf("1=1");
}else
{
GetPrime(n);
GetFactor(n);
printf("%d=", n);
PrintFactor();
}
return 0;
}