while if循环问题,程序发生段错误,求解

赤练仙子_ 2016-06-06 05:12:09
【编程题】质数因子
功能:输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如180的质数因子为2 2 3 3 5 )
输入描述:
输入一个long型整数
输出描述:
按照从小到大的顺序输出它的所有质数的因子,以空格隔开
输入例子:
180
输出例子:
2 2 3 3 5
我的代码while (n > 1)条件下再判断if (n % p == 0),编译器报错:段错误:您的程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)等情况引起,为什么不可以这样写啊,不懂,求解
#include <iostream>
#include <vector>

using namespace std;

int main()
{
long n;
int i = 0, p = 2;
vector <int> a;

while (cin >> n)
{
while (n > 1)
{
if (n % p == 0)
{
n = n / p;
a[i] = p;
++i;
}
else
++p;
}
for (int i = 0; i < a.size(); ++i)
cout << a[i] << ' ';
}
return 0;
}
...全文
292 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
luciferisnotsatan 2016-06-07
  • 打赏
  • 举报
回复
引用 6 楼 lonely1206 的回复:
[quote=引用 2 楼 luciferisnotsatan 的回复:] 之前vector用法错误,可以改成a.push_back(p); 建议lz好好理解下vector是什么
vector用法没错,可以用下标访问的,之前是复杂度太高所以没通过[/quote] vector是可以用下标访问,但你的代码而言,在赋值时,用下标可能导致越界。push_back会自增长,用下标不会。
赤练仙子_ 2016-06-07
  • 打赏
  • 举报
回复
引用 4 楼 paschen 的回复:
[quote=引用 1 楼 lonely1206 的回复:] 改了代码,通过了,之前写得太啰嗦了
#include <iostream>

using namespace std;

int main()
{
    long n;
    int p = 2;
    
    while (cin >> n)
    {
        while (n > 1)
        {
            if (n % p == 0)
            {
                n = n / p;
                cout << p << ' ';
            }
            else
            	++p;
        }
    }
    return 0;
}
新改这个我帮你调试了,没问题啊[/quote]嗯,谢谢版主,改得这个通过了
赤练仙子_ 2016-06-07
  • 打赏
  • 举报
回复
引用 2 楼 luciferisnotsatan 的回复:
之前vector用法错误,可以改成a.push_back(p); 建议lz好好理解下vector是什么
vector用法没错,可以用下标访问的,之前是复杂度太高所以没通过
13123214 2016-06-06
  • 打赏
  • 举报
回复
改的不错。。
paschen 版主 2016-06-06
  • 打赏
  • 举报
回复
引用 1 楼 lonely1206 的回复:
改了代码,通过了,之前写得太啰嗦了
#include <iostream>

using namespace std;

int main()
{
    long n;
    int p = 2;
    
    while (cin >> n)
    {
        while (n > 1)
        {
            if (n % p == 0)
            {
                n = n / p;
                cout << p << ' ';
            }
            else
            	++p;
        }
    }
    return 0;
}
新改这个我帮你调试了,没问题啊
小灸舞 2016-06-06
  • 打赏
  • 举报
回复
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步Debug版对应汇编一行!
单步Debug版对应汇编千行不如单步Release版对应汇编一行!
不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!
luciferisnotsatan 2016-06-06
  • 打赏
  • 举报
回复
之前vector用法错误,可以改成a.push_back(p); 建议lz好好理解下vector是什么
赤练仙子_ 2016-06-06
  • 打赏
  • 举报
回复
改了代码,通过了,之前写得太啰嗦了
#include <iostream>

using namespace std;

int main()
{
    long n;
    int p = 2;
    
    while (cin >> n)
    {
        while (n > 1)
        {
            if (n % p == 0)
            {
                n = n / p;
                cout << p << ' ';
            }
            else
            	++p;
        }
    }
    return 0;
}

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧