最大质因数

  在进一个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:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值