【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;
}
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术