题解 | #整除问题#

整除问题

https://www.nowcoder.com/practice/8e29045de1c84d349b43fdb123ab586a

/*新经验:

算法逻辑完全正确,但输出陷入死循环导致超时,
不如看看循环条件的变量,是否沿用判断里的了,应该要开一个新数重新赋值。
如第62行:
int ii=i;//必须给i开新的数运算,否则就会一直死循环然后超时

*/

//牢牢记住这句话:所有数都等与  一个或多个质数相乘的形式 
#include <iostream>
#include <vector>
using namespace std;
struct zyz
{
    int x;//质因子是谁
    int y;//x的个数
    long long z;//n有多少个x因子
};

vector<zyz> vec;//每个质因子是什么,个数

void Qvec(int a)
{
    int bound=a;
    for(int i=2;i<=bound;i++)//如果a是质数,那就=bound
    {
        int count=0;
        zyz element;
        element.x=i;
        element.y=0;
        if(a%i==0)
        {  
            while(a%i==0)
            {
                element.y++;
                a/=i;
            }
            vec.push_back(element);

        }
    }
}
int main() {
    int a, n;
    while (cin >> n >> a) { 
        
        Qvec(a);//先算出a的vec
       // long long mul=1;
  

        for(int j=0;j<vec.size();j++)vec[j].z=0;

        for(int i=2;i<=n;i++)//
        {
           // mul*=i;//用这种真的去乘阶层的方法会导致超界(long long 最大19位)
           int ii=i;//必须给i开新的数运算,否则就会一直死循环然后超时
            for(int j=0;j<vec.size();j++)
            {
                while((ii!=1)&&(ii%vec[j].x==0))
                {
                   ii/=vec[j].x;
                    vec[j].z++;
                }
            }
           
        }
     //   cout<<"mul:"<<mul<<endl;//
    //    for(int j=0;j<vec.size();j++)//
      //  {
      //      cout<<"x:"<<vec[j].x<<" y:"<<vec[j].y<<" z:"<<vec[j].z<<endl;//
      //  }//


        int k=0;

        k=(vec[0].z)/(vec[0].y);
        for(int j=0;j<vec.size();j++)
        {
            if((vec[j].z)/(vec[j].y)<k)k=(vec[j].z)/(vec[j].y);
        }
        cout<<k<<endl;
    }
}

全部评论

相关推荐

Southyeung:我说一下我的看法(有冒犯实属抱歉):(1)简历不太美观,给我一种看都不想看的感觉,感觉字体还是排版问题;(2)numpy就一个基础包,机器学习算法是什么鬼?我感觉你把svm那些写上去都要好一点。(2)课程不要写,没人看,换成获奖经历;(3)项目太少了,至少2-3个,是在不行把网上学习的也写上去。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-01 11:27
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务