在进一个c++交流群的时候,进群需要回答问题,这个问题就是群号的最大质因数,最大质因数也就是是某个数的因数且是质数。
解决方法一:我开始的想法,直接用这个数对所有质数取余,然后不断更新结果(或者用vector数组,一直push_back,然后获取end()就是我们要的结果),最后得到我们想要的值,于是乎便有了以下的代码,也是最坏的一种方法,因为数据量越大,两个循环跑的次数o(n^2),我们要求的值越大,求的质数也就越多,然后似乎就要跑很久的for循环,所以以下代码似乎跑不完for循环。
long long s = 522912728;
bool is = false;
for (long long i = 1; i <= s; i++)
{
for (long long j = 2; j < i; j++)
{
if (i%j == 0)
{
is = false;
break;
}
else
is = true;
}
if (is)
{
if (s%i == 0)
{
cout << i << " ";
}
}
}
cout<<"hello"<<endl;//程序或许运行不到这,因为我试了一下,很久没反应或者说是一直在计算。
解决方法二:http://blog.csdn.net/w605283073/article/details/52750786,虽然还是有点看着迷糊,但是我也清楚了为什么我上面的程序跑不完,或者说是一直在计算,所以根据这篇文章,我重新改了一下代码,与上面不同的,也就一个地方,s(即我们要求的值)的值一直在更新或者说是缩小,原本的思想是s对所有的质数取余,改了之后的代码思想,当每次求出该质数是s的因数,则用temp保存下来,然后s/temp,就把s的范围给缩小了下来,这样做是因为,s这个值若是质数,则最大的质因子就是它本身,若不是,则将s因式分解到最小因式,而最小的因式也就是不能分解(即,质数),通过缩小最小因式范围得到最大的质因子
例如90,由2,3,5一系列乘法组成,则90从2开始取余数,90%2==0,则90/2=45,45%2!=0,此时2因子已经取完了,则对3取余,45%3=0,45/3=15,按照我的代码,是继续把15从2开始取,若不是则到3,与上面的那个blog不同的是,它是通过一个lastfactoy记录了这个值,不用再从2开始,而是从3开始,然后接下来的运行就是,15%3=0,15/3=5,5是一个质数,所以无需再运算,也就是最大的质数是5.
unsigned int s = 522912728;
bool is = false;
unsigned int temp = 0;
for (unsigned int i = 1; i <= s; i++)
{
for (unsigned int j = 2; j < i; j++)
{
if (i%j == 0)
{
is = false;
break;
}
else
is = true;
}
if (is)
{
if (s%i == 0)
{
s = s / i;
temp = i;
cout << temp << " ";
}
}
}
cout << "hello"<<endl: