C将一个数分解成质因数
C factoring a number into prime factors
我编写了一个程序,将数分解为质因数,然后将它们存储在一个向量中,最后询问是否通过将它们相乘来验证结果。
它是这样工作的:请求一个数字(代码中的num
),并将其除以2并向上。
如果它发现一个数(代码中的divisor
)其模(当num
mod divisor
时)为零,则将该除数存储到一个向量中,并将num
除以divisor
并将其存储到temp
中,并将除数重置为1(并且while
循环中的最后一条语句将其自增为2)。如果没有找到这样的数字,divisor
会增加,直到大于或等于num
。这个过程一直持续到divisor
大于num
。
代码如下:
#include <iostream>
#include <vector>
using namespace std;
int main() {
//num=the number of interest
//divisor=the number dividing the number of interest each time
unsigned long divisor=2, num, temp ; //num=13699293826d
char c;
vector<unsigned long> divisors;
cout<<"Enter a number: "<<endl;
cin>>num;
//temp stores the number that is reduced each time
temp=num;
while(divisor<=num)
{
if(temp%divisor==0)
{
temp=temp/divisor;
divisors.push_back(divisor);
cout<<"one "<<divisor<<endl;
cout<<"the number of interest is now"<<temp<<endl;
divisor=1;
}
if(divisor==temp&&temp!=1)
{
cout<<"two " << divisor<<endl;
divisors.push_back(divisor);
}
divisor++;
}
if(divisors[0]==num)
{
cout<<"The number: "<<num<<" is prime. ";
}
else
{
cout<<"Its proper divisors are: ";
for(unsigned int count=0; count<divisors.size(); count++ )
{
cout<<divisors[count]<<"t";
}
}
cout<<"Print out the multiplication? Press 'Y' or 'N'."<<endl;
cin>>c;
if(c=='Y'||c=='y')
{
for(unsigned int count=0; count<divisors.size(); count++)
{
temp*=divisors[count];
cout<<temp<<"t";
}
}
return 0;
}
我打印了一些调试cout
语句。
我遇到的问题是:当这个数字足够大时,调试将无法执行语句"感兴趣的数是现在"后面有数字1。然后,程序崩溃。
代码有什么问题?
谢谢。
是的,我在64位运行。
示例程序输出:
Enter a number:
13699293826
one 3
the number of interest is now: 1431655765
one 5
the number of interest is now: 286331153
one 17
the number of interest is now: 16843009
one 257
the number of interest is now: 65537
one 65537
the number of interest is now: 1
然后程序崩溃。
我还注意到3的第一个"质因数"是不正确的,因为13699293826除以3等于4562761275.333333333333333.....
编辑# 2 ------------------------------------------
temp 65537, divisor 62287
..............omitted output
temp 65537, divisor 65530
temp 65537, divisor 65531
temp 65537, divisor 65532
temp 65537, divisor 65533
temp 65537, divisor 65534
temp 65537, divisor 65535
temp 65537, divisor 65536
temp 65537, divisor 65537
one 65537
the number of interest is now: 1
Its proper divisors are: 3 5 17 257 65537 Print out the multiplication? Press 'Y' or 'N'.
然后程序停止响应,当我按"y"并输入。
同时,相乘的数字也不正确;结果是4294967295…在谷歌上搜索后,它说这是"使用32位(二进制数字)可以得到的最高数字"。但是在我的电脑上,显示操作系统是64位的
当您收到消息"感兴趣的数量现在是1"时,这意味着temp == 1
现在。你应该在这里停下来,但你继续,因为你的循环错误地比较了divisor
和num
,而它应该比较temp
。
现在是temp == 1
和divisor == 2
,你将循环直到unsigned long divisor
绕到0。此时,您的检查if(temp%divisor==0)
导致除零。我希望这种情况发生在任何输入
你不应该重置divisor
,你的循环条件是错误的。你的循环应该像这样:
while( divisor*divisor <= temp)
{
if(temp%divisor==0)
{
temp=temp/divisor;
divisors.push_back(divisor);
cout<<"one "<<divisor<<endl;
cout<<"the number of interest is now"<<temp<<endl;
///// divisor=1;
}
/* ------ if(divisor==temp&&temp!=1)
{
cout<<"two " << divisor<<endl;
divisors.push_back(divisor);
} ------- */
else ////////
divisor++;
}
if( temp > 1)
{
divisors.push_back( temp );
temp = 1; // <<-------------- ADD THIS
}
- 通过递归进行因子分解
- 有人能分解一下这个c++模板的语法吗
- C++ 乔列斯基因式分解
- 如何加快本征C++中的LU分解?
- 如何将整数分解为不同的变量?
- 减少本征的 QR 分解
- Xcode 中的加速框架以获得 A 的 QR 分解,但找不到 zgeqrf
- 将无向连接图分解为两个组件
- 在 C++ 中分解数字
- 分解SWIG Python接口 - 容器会产生命名空间冲突
- 对模板参数包操作进行因素分解
- 如何修复 LU 分解?
- 动态矩阵特征分解过程中的误差
- 正在从程序内存中分解x指令
- 数字误差的质因数分解
- C将一个数分解成质因数
- 把一个数分解成质因数
- 用递归进行质因数分解
- 如何优化这个c程序来找到一个数字的质因数分解
- 给定一个数的质因数分解,在c++中不递归地遍历所有因子