NOI-OJ 1.13 ID:22 因子分解
总时间限制: 1000ms 内存限制: 65536kB
描述
输入一个数,输出其素因子分解表达式。
输入
输入一个整数 n (2 <= n < 100)。
输出
输出该整数的因子分解表达式。
表达式中各个素数从小到大排列。
如果该整数可以分解出因子a的b次方,当b大于1时,写做 a^b ;当b等于1时,则直接写成a。
样例输入
60
样例输出
2^2*3*5
关键点
- 找到素数(使用素数筛)
这道题的数据很小(2~100),其实直接先算出来,存到数组即可。 - 因子求解
从小到大查看素数是否可以被整除,这边我的算法可以优化(也是必须要会):比如计算2,一直等到 x % 2 ! = 0 x\%2!=0 x%2!=0为止。把2的次数给求出来了,也直接能输出。
算法评价
- 代码太复杂,1)可以一次性把次方都计算出来。2)在计算出次方之后,可以直接输出。
- 可以不使用prime数组。
代码
const int maxn = 1001;
int prime[maxn] = {0}; // 素数数组
int p[maxn] ={0}; // 0表示素数
int FindPrime(int M){
int cot = 0;
p[0] = p[1] = 1;
for(int i=2;i<=M+1;i++){
if(p[i]==false){
prime[cot++]=i;
for(int j=2*i;j<=M+1;j+=i){
p[j]=1;
}
}
}
return cot;
}
int main(){
int a = 0;
// input
cin >> a;
// find the number of prime
int cot = FindPrime(a);
int num = a;
int num1[cot] ={0}; // save times
int note = 0; //
while(num!=1){
int index=0;
while(prime[index]!=0){ // 可以一次把prime全部整除掉。
if(num%prime[index]==0){
if(prime[index]>prime[note]){ //记录最大的因子,知道哪一个素数是最后一个素数,用于输出。
note=index;
}
num1[index]++;
num = num / prime[index];
break;
}
index++;
}
}
// output
for(int i=0;i<cot;i++){
if(num1[i]==1)
cout << prime[i];
else if(num1[i]>1)
cout << prime[i] << "^" << num1[i];
else{
continue;
}
if(i!=note){
cout << "*";
}
}
return 0;
}