C语言将数分解成素数之积,关于c ++:C将数分解为素数-程序员宅基地

技术标签: C语言将数分解成素数之积  

我编写了一个程序,将数字分解为主要因子,然后将其存储在向量中,最后询问是否通过将它们相乘来验证结果。

它是这样工作的:要求输入一个数字(代码中的num),然后将其除以2并向上取整。

如果找到模(当num mod divisor时)的模为零的数字(代码中的divisor),则将该除数存储为向量,并通过除以divisor来减小num并将其存储到temp中,并将除数重置为1(while循环中的最后一条语句会将其递增为2。如果未找到该数字,则divisor会增加直到其大于或等于。此过程一直持续到divisor大于num。

这是代码:

#include

#include

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 divisors;

cout<

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<

cout<

divisor=1;

}

if(divisor==temp&&temp!=1)

{

cout<

divisors.push_back(divisor);

}

divisor++;

}

if(divisors[0]==num)

{

cout<

}

else

{

cout<

for(unsigned int count=0; count

{

cout<

}

}

cout<

cin>>c;

if(c=='Y'||c=='y')

{

for(unsigned int count=0; count

{

temp*=divisors[count];

cout<

}

}

return 0;

}

我已经打印了一些debug 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位的最高数字(二进制??位)"。但是在我的PC上,它表示操作系统是64位。

您是否在64位平台上?

为什么不在if(temp%divisor==0)语句块的顶部添加cout < ...那么您可以看到正在除以哪些数字以及temp结果是否有意义。 最好编辑您的问题以包括导致崩溃的输出。 您还可以在交互式调试器中观察执行情况,查看变量是否包含期望的值以及确切的行崩溃。

当在SO上询问有关错误的问题时,应始终包含完整的错误消息。

在整个程序中的任何地方都使用unsigned long long。 unsigned long仍为32位。 您的长号被截断,变成1431655765 * 3 = 4294967295 = 2^32 - 1。 它就在您的输出中。 它的因式分解确实是3,5,17,257,65537。

当您收到消息"感兴趣的数目现在为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<

cout<

/ divisor=1;

}

/* ------ if(divisor==temp&&temp!=1)

{

cout<

divisors.push_back(divisor);

} ------- */

else

divisor++;

}

if( temp > 1)

{

divisors.push_back( temp );

temp = 1;  // <

}

但是,当我使用此循环条件时,输出关闭:输入数字:23425一个5感兴趣的数字现在为4685一个5感兴趣的数字现在为937其适当的除数是:5 5 937打印出乘法?按Y或N。y 4685 23425 21949225输出应为:输入数字:23425一5感兴趣的数字现在是4685一5感兴趣的数字现在是937一937感兴趣的数字现在是1它的适当除数是:5 5 937打印出乘法?按Y或N。y 5 25 23425

您引用的两个输出的意思完全相同:23425 = 5*5*937。

感谢您的注释,我已将循环条件修改为if(temp!= 1)

if(temp!=1)是错误的。它将工作太久。这会使您的程序非常慢。

我还有一点问题。您是如何提出(除数*除数?=温度)条件的?

这就是素性测试算法中众所周知的部分。如果a*b=n和a <= b,则为a <= sqrt(n)或a*a <= n。无需测试较大的b-保证可以早些达到较小的a。如果没有,那么n肯定是素数。在分解的情况下,当我们找到a时,我们会将其除以n,因此剩下b。然后继续temp = b。如果是素数,我们会停在其平方根。因此,如果temp>1结尾,则为最后的除数。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_32916385/article/details/117207950

智能推荐

制作PPT的7条黄金法则-程序员宅基地

文章浏览阅读514次。导读:制作具有视觉吸引力的演示文稿的速成指南。作者:玛丽昂·沙罗(Marion Charreau)、珍妮弗·约翰逊(Jenifer L. Johnson)来源:大数据DT(ID:hzdas..._ppt黄金法则

ATX安装及简单使用_atx使用-程序员宅基地

文章浏览阅读6.2k次。1.测试环境搭建 python[3.8] python3.5及以下的版本后面执行连接手机connect的时候会报错,请安装3.6及以上版本。我装的版本是3.8的 1.1 安装atx pip install atx 1.2 安装opencv 下面两种选择一种即可 镜像安装 ..._atx使用

idea卸载与重装_idea卸载干净并重新安装-程序员宅基地

文章浏览阅读1.2w次,点赞12次,收藏79次。idea卸载与重装。_idea卸载干净并重新安装

安装Nodejs踩过的坑:npm安装报错npm ERR code EPERM npm ERR syscall mkdir npm ERR path DProgram Filesnod..)_>npm init vue@latest npm err! code eperm npm err! -程序员宅基地

文章浏览阅读870次,点赞3次,收藏5次。今天学vue到webpack,大无语了家人们,从第一步npm installl的安装开始,就逐渐陷入了npm的坑!首先,从官网下载node.js,链接Download | Node.js,根据自己的电脑配置选择安装版本(推荐LST稳定版本的),然后按照安装步骤操作就行,直到测试安装的时候,开始报错了:网上查找了许多博文之后找到了解决方法:1、删除C:Users用户下的.npmrc文件这里我的.npmrc是正常显示的,如果你的没有,看是不是因为将隐藏的项目勾选上了,然后去掉勾选。2、在命令行输入_>npm init vue@latest npm err! code eperm npm err! syscall open npm err! path

Java8流式操作-根据集合的某个属性值取交集,差集_java 根据某个属性判断两个集合中的差集-程序员宅基地

文章浏览阅读4.7k次,点赞5次,收藏19次。这里是使用一个自定义类的集合和一个Integer类的集合做的一次栗子,两个封装类的操作,或者两个基本类型的集合操作都是类似的。public class CollectionTest { public static void main(String[] args) { List<Customer> list = new ArrayList<>(); Customer customer = new Customer(); cus_java 根据某个属性判断两个集合中的差集

JQuery:ajax后台返回list,前台用jquery遍历list-程序员宅基地

文章浏览阅读68次。JQuery:ajax后台返回list,前台用jquery遍历list

随便推点

AcWing 847 图中点的层次_acwing847. 图中点的层次-程序员宅基地

文章浏览阅读368次。题目描述:给定一个n个点m条边的有向图,图中可能存在重边和自环。所有边的长度都是1,点的编号为1~n。请你求出1号点到n号点的最短距离,如果从1号点无法走到n号点,输出-1。输入格式第一行包含两个整数n和m。接下来m行,每行包含两个整数a和b,表示存在一条从a走到b的长度为1的边。输出格式输出一个整数,表示1号点到n号点的最短距离。数据范围1≤n,m≤10^..._acwing847. 图中点的层次

MxSrvs pcntl 扩展-程序员宅基地

文章浏览阅读693次。so文件在“/Applications/MxSrvs/bin/php/lib/php/extensions/no-debug-non-zts-20190902”目录下。准备安装autoconf(如果有安装就不用这一步了)自动配置安装完成后,执行生成配置文件。再次安装autoconfig。安装pcntl扩展。_mxsrvs

CMS垃圾收集器和G1垃圾收集器_cms和g1收集器-程序员宅基地

文章浏览阅读6.2k次。CMSCMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的老年代收集器。CMS收集器与之前的垃圾收集器最大的特点就是它可以并发清除垃圾。他的工作流程如下:初始标记(CMS initial mark)并发标记(CMS concurrent mark)重新标记(CMS remark)并发清除(CMS concurrent sweep)其中初始标记、重新标记这两个步骤仍然需要“Stop The World”。初始标记仅仅只是标记一下GCRoots能直接_cms和g1收集器

Scrapy爬虫 Settings(设置)_scrapy custom_settings去除默认自带得content-length-程序员宅基地

文章浏览阅读5.2k次,点赞2次,收藏7次。开发环境:Python 3.6.0 版本 (当前最新)Scrapy 1.3.2 版本 (当前最新)设置Scrapy设置允许您自定义所有Scrapy组件的行为,包括核心,扩展,管道和爬虫本身。设置的基础结构提供了键值映射的全局命名空间,代码可以使用它从中提取配置值。可以通过不同的机制来填充设置,这将在下面描述。这些设置也是选择当前活动Scrapy项目的机制(如果您有很多)。有..._scrapy custom_settings去除默认自带得content-length

2020最新:Github下载资源慢?失败?下载速度降到0? 无法下载 release?_github 无法下载 releare-程序员宅基地

文章浏览阅读3.0k次,点赞12次,收藏9次。网上大部分方案不是已经失效了就是不好用太麻烦修改hosts文件码云clone云云点开即达我珍藏的网址下载速度超快可下release无广告在此也非常非常非常感谢这位作者所做出的伟大贡献!!!..._github 无法下载 releare

ubantu安装教程及vmware_vmware 安装ubantu csdn-程序员宅基地

文章浏览阅读361次。VMware下载官网 我下载的是14版本 来源网站(https://www.douban.com/note/639107631/) 下载链接: https://download3.vmware.com/software/wkst/file/VMware-workstation-full-14.0.0-6661328.exe 安装密钥 VMware 14 Pro 永久许可证激活密钥..._vmware 安装ubantu csdn