题目:
给出一个将任意正整数分解为素数之积的算法.用该算法将12,123,1234,12345,……分解为素数之积。
方法:
基本方法找到N的一个质因子,使N:=N/N的质因子,直到N为质数为止。
算法流程图:
算法代码:
//@pre Vnumber. |primePR[]|=down[log2(number)]+1 ∧ number>=2 ∧ number-down[number]=0
//@post Vi.0<i<=local_prime -> isPrime(primePR[i]) ∧ primePR[1]至primePR[local_prime]所有数的乘积=number ∧ primePR[0]=use_count(primePR[])=质因子的个数
void Number::core_getItsPrimeProduct(int primePR[],double number) const
{
double copy_number=number;
int local_prime=1;//用于记录存储下一个质因子位置
int temp=static_cast<int>(std::sqrt(copy_number));
double result_temp;
while (temp!=1)
{
result_temp=copy_number/temp;
if(result_temp-static_cast<int>(result_temp)==0)
{
int flag1=0,flag2=0;
//@ temp>1 ∧ temp-down[temp]=0
if (this->core_isPrime(temp))
{
primePR[local_prime]=temp;
local_prime++;
flag1=1;
}
//@ result_temp>1 ∧ result_temp-down[result_temp]=0
if (this->core_isPrime(result_temp))
{
primePR[local_prime]=result_temp;
local_prime++;
flag2=1;
}
if (flag1==1&&flag2==1)
{
break;//若除数和商都是质数则结束质数积分解
}
if (flag1==1)
{
copy_number=result_temp;//在两个不都是质数时 若除数为质数则将商继续分解 否则将除数继续分解
temp=static_cast<int>(std::sqrt(copy_number));
continue;//若在两个不都是质数时 跳过temp--继续执行while
}
else if(flag2==1)
{
copy_number=temp;
temp=static_cast<int>(std::sqrt(copy_number));
continue;//若在两个不都是质数时 跳过temp--继续执行while
}
//最后一种情况 若flag1和flag2都等于0,也就是分成两个合数的情况,这时什么都不做直到分到其中一个为质数为止
}
temp--;
}
if(local_prime==1)//当number本身为质数时不需分解
{
primePR[0]=1;
primePR[1]=copy_number;
return;
}
primePR[0]=local_prime-1;//将质因子的个数存入数组primePR[0]中
}
结束:
这个是自己写的,若有错误请见谅并指出,本人一定会认真修改。