1975年,John M. Pollard提出了一种新的算法,算法时间复杂度为O(n^1/4)。
求一个数分解质因数,要从最小的质数除起,一直除到结果为质数为止。分解质因数的算式的叫 短除法,和除法的性质差不多,还可以用来求多个个数的公因式:
如24
2┖24(是短除法的符号)
2┖12
2┖6
3——3是质数,结束
得出24=2×2×2×3=2^3×3(m^n=m的n次方)
再如105
3┖105
5┖35
----7——7是质数,结束
得出105=3×5×7
John M. Pollard算法思想就是短除法用的思想。
#include<stdio.h>
int main()
{
int num = 24;//需要分解的数,根据数的大小选择类型
int i = 2;
for(i=2; i<=num/2; i++)
{
while(num >= i)
{
if(num % i == 0)//能被整除
{
printf("%d * ", i);//输出
num /= i;//模仿短除法
}
else
break;
}
}
printf("%d\n", num);
return 0;}
输出:2 * 2 * 2 * 3
基本思想如上所述,具体程序需要自己改代码,比如选择数据类型,可能是long long类型,最后输出也要控制,比如num为8的时候会输出2 * 2 * 2 * 1,所以最后还得对num进行判断,如果是1则不要输出了。
最后比较完整的程序:
#include<stdio.h>
int main()
{
long long num;
printf("please input a number:");
scanf("%lld", &num);
int i = 2;
printf("%lld = ", num);
for(i=2; i<=num/2; i++)
{
while(num >= i)
{
if(num % i == 0)//能被整除
{
if(num / i == 1)
printf("%d\n", i);
else
printf("%d * ", i);
num /= i;//模仿短除法
}
else
break;
}
}
if(num != 1)
printf("%lld\n", num);
return 0;
}