【PTA】2-7 素因子分解 (20 分) 段错误分析

题目:

给定某个正整数 N,求其素因子分解结果,即给出其因式分解表达式 N=p1k1p2k2pmkm

输入格式:

输入long int范围内的正整数 N。

输出格式:

按给定格式输出N的素因式分解表达式,即 N=p1^k1*p2^k2*…*pm^km,其中pi为素因子并要求由小到大输出,指数kipi的个数;当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;
}
复制代码

 

posted @   LisavilaLee  阅读(361)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示