#include <stdio.h>
void factz(int num);
int main()
{
int num;
scanf("%d", &num);
factz(num);
return 0;
}
void factz(int num)
{
int div, i;
int isprime = 1; //假設這個數是質數
for (div=2; div*div<=num; div++) //因數不用從2找到num,只要找到根號num就可以了
{
if (num%div == 0)
{
if (isprime == 0) printf(" * "); //如果之前isprime的狀態沒有被改變過,代表這是我們找到的第一個因數,所以就不用印 * 號在前面
isprime = 0; //一旦找到因數了,就代表這個數不再是質數了
printf("%d", div);
num = num/div;
i=1;
while (num%div==0) //看看這個因數能不能反覆除該數多次,並且用i紀錄我們除了幾次,這個i將會是次方
{
num = num/div;
i++;
}
if (i>1) printf("^%d", i); //如果次方大於1就印出該因數可以除幾次
}
}
if (isprime) printf("%d", num); //最後的最後,如果上面都沒找到半個因數,就是質數,則印出自己
else if (num != 1) printf(" * %d", num); //要不然,有因數的話就把最後除以因數後的商印出來,如果商是1就不用印了
}
判斷質數的地方可以改
你用++i,但是其實偶數(除了2以外)都一定不是值數,所以不用考慮
可以改成:
bool isprime(int n) {
if(n == 1)
return 0;
if(n & 1) {
int mx = sqrt(n) + 1;
for(int i = 3; i <= mx; i += 2)
if(!(n % i))
return 0;
return 1;
}
return (n == 2);
}