#include<stdio.h>
using namespace std; 
int main()  
{  
    int i,n;  
    scanf("%d",&n);  
    for(i=2;i<=n;i++)  
    {  
        while(n!=i)     //若i=n,则质因数就是n本身  
        {  
            if(n%i==0)  //若i是质因数,则打印出i的值,并用商给n赋新值  
            {  
                printf("%d\n",i);  
                n=n/i;  
            }  
            else break;//若不能被i整除,则算下一个i  
        }  
    }  
    printf("%d\n",n);   //这里是打印最后一个质因数,也就是等于i时的那个  
    return 0;  
}  

超时

2 条评论

  • undefined和jtwd2这两个测评机测评的不一样

  • 假设一个数n有两个质因子,一个为2,另一个就为a(n/2),这时a*a>=n;

    所以可得以下核心代码

    while(a!=1&&i*i<=a)//假设那个数为a,因为最后一个质因子的平方可能>=a,也有可能a本身为质数
    {
        while(a%i==0)//当i为质因子时(不可能是合数)
        {
            cout<<i<<' ';
            a/=i;
        }
        if(i%2==0)i++;
        else i+=2;//稍微提升一下速度,可以直接为i++
    }
    if (a!=1)cout<<a;//若a不为1,则现在的a为最后那个质因子
    
    
  • 1

信息

ID
1770
难度
5
分类
(无)
标签
递交数
41
已通过
14
通过率
34%
被复制
6
上传者