acm 判断一个数是不是两个素数的乘积

来源:百度知道 编辑:UC知道 时间:2024/05/27 00:58:32
给出一个数判断这个数是不是两个素数的乘积
例如6 = 2 *3
那么输入6时就输出yes,否则输出no
说一下算法就可以(注:不要硬跑,硬跑我也会,时间越短越好)
数据规模1<=n<=1000 000 000, 如果要硬跑的话,请在1s内解决.并且空间限制是1m.请尽快解决,谢谢.

先写一个函数,判断是否为素数,如Prime(),如果是素数返回1,不是返回0。
然后判断输入的数字a是不是大于3的素数,如果是,继续计算。
然后写一个循环i = 2 to a ,
用函数判断i是不是素数,如果是,则判断a mod i 是否为0,如果是,记下此时的i
b = i
然后计算c = a / b
判断c是否为素数,如果是,则得出结论a是素数b和素数c的乘机,如果不是那就说明a不是由2个素数的乘积组成的。

目前的数学水平,暂时还没有任何办法来肯定一个数是否是素数.
除了硬跑(验证)外.
你说:给出一个数判断这个数是不是两个素数的乘积
可以肯定的说,如果一个数不是素数的乘积,那么它必为素数.
你的要求无解.也没有这样的算法.

反正我试了下这个代码可以在一秒内计算完10000000000的素数
void main()
{
unsigned long long n,i=3;
cin >> n;
if(n % 2 == 0)
goto no;
for(i=3;i<n;i+=2)
if(n % i == 0)
goto no;
cout << "yes" <<endl;
system("PAUSE");
return;
no:
cout << "no" <<endl;
system("PAUSE");
}

打表啊!acm里很常用的。
先做一个1~32000的素数表。
然后一个个试除。