【PTA】2-7 素因子分解 (20 分) 段错误分析
题目:
给定某个正整数 N,求其素因子分解结果,即给出其因式分解表达式 N=p1k1⋅p2k2⋯pmkm。
输入格式:
输入long int范围内的正整数 N。
输出格式:
按给定格式输出N的素因式分解表达式,即 N=p1^k1*p2^k2*…*pm^km,其中pi为素因子并要求由小到大输出,指数ki为pi的个数;当ki为1即因子pi只有一个时不输出ki。
输入样例:
1323
输出样例:
1323=3^3*7^2
解析:
第一次写的时候是拿素数筛加上递归写的,然后估计递归的层数过大然后爆了。
第二次写的时候是拿素数筛加上试除法(循环,从2开始的素数一次次除干净再跳到下一个素数除)写的,然后第二个测试点还有段错误。
最后还是老老实实用了每遇到一个数字去判断是否为素数,再加上之前的试除法就对了。
估计是题目说了数字的范围是在long int,所以素数筛组成的数组装不下那么大的素数才段错误的。
附上AC代码。
AC代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll n;
bool pri[MAXN];
bool flag;
bool isprime(ll x)
{
    bool ans=1;
    for(int i=2;i<=sqrt(x);i++){
        if(x%i==0){
            ans=0;
            break;
        }
    }
    return ans;
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n;
    if(isprime(n)){
        cout<<n<<"="<<n<<endl;
        return 0;
    }
    cout<<n;
    for(ll i=2;i<=n;i++){
        if(!isprime(i)||n%i!=0){
            continue;
        }
        ll cnt=0;
        while(n%i==0){
            n/=i;
            cnt++;
        }
        if(flag==0){
            flag=1;
            cout<<"=";
        }
        else{
            cout<<"*";
        }
        if(cnt==1){
            cout<<i;
        }
        else{
            cout<<i<<"^"<<cnt;
        }
        if(n==1){
            break;
        }
    }
    return 0;
}
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号