给定某个正整数 N,求其素因子分解结果,即给出其因式分解表达式 N=p1k1⋅p2k2⋯pmkm。
输入格式:
输入long int范围内的正整数 N。
输出格式:
按给定格式输出N的素因式分解表达式,即 N=p1^k1*p2^k2*…*pm^km
,其中pi
为素因子并要求由小到大输出,指数ki
为pi
的个数;当ki
为1即因子pi
只有一个时不输出ki
。
输入样例:
1323
输出样例:
1323=3^3*7^2
题目分析:
首先要理解何为n的素数因子。
素数因子即能被n整除,且为素数的数。
由此,将n的素数因子全部找出来,再统计个数,最后输出即可。
代码:
#include <stdio.h>
#include <math.h>
int isprime(long int a);
int main(){
long int n;
/*arr用来记录满足条件的素数因子
*Arr用来记录不同素数因子各自的个数*/
int arr[10240] = {0}, countArr = 0, Arr[102400] = {0};
scanf("%ld",&n);
long int cn = n;
if(isprime(n) == 1){ //若n本身为素数,直接输出,并且退出程序
printf("%ld=%ld",n,n);
return 0;
}
int j = 2;
while(1){
if(cn % j == 0 && isprime(j) == 1){ //若j为n的素数因子
arr[countArr] = j; //将满足条件的素数因子存入arr中
countArr++;
cn = cn / j;
/*因为同一个素数因子可以多次出现,
*所以要设计算法:若j能进入if,j不变。不能进进入时,搜索下一个素数因子。
*方法就是,若能进入if,j--,等出if后,再j++,回复原值*/
if(cn < 2) break; //当cn<2时,不再有素数因子,直接退出循环
}
j++;
}
for(int i = 0; i < 10240; i++){
if(arr[i] != 0){
Arr[arr[i]]++; //如此,Arr的下标及为arr中存入的元素,其值即为某一元素的个数
if(Arr[arr[i]] == 1) count++; //count用来记录不重复的素因子的个数,在输出*时会派上用场
}
}
printf("%ld=",n);
for(int i = 0; i < 102400; i++){
if(Arr[i] == 1){ //若某一个素数元素只出现一次
printf("%ld",i);
count--; //因为最后一个元素输出时后面不要跟*,所以当count减到0时,不用输出*
if(count != 0) printf("*");
} //如果某个数出现一次,直接输出
else if(Arr[i] > 1){ //若某一个素数元素出现次数大于1
printf("%ld^%ld",i,Arr[i]);
count--;
if(count != 0) printf("*");
}
}
return 0;
}
int isprime(long int a){ //素数的判断
if(a <= 2) return 1;
else{
for(long int i = 2; i <= (long int)sqrt(a); i++){
if(a % i == 0) return 0;
}
}
return 1;
}