鱼C论坛

 找回密码
 立即注册
查看: 3018|回复: 3

完数问题

[复制链接]
发表于 2012-2-20 14:18:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
谭浩强的一道习题求1000以内完数
一个数如果恰好等于它的因子之各,这个数就称为完数,如6的因子是1,2,3,6=1+2+3,因此6是完数。
我的程序如下:
#include<stdio.h>
main()
{
        long i,k,m;
        for (m=2;m<=1000;m++)
        {
                for (i=1,k=0;i<=m/2;i++) if (m%i==0) k=k+i;
                if (m==k) printf("%ld\n",m);
        }
}

我用的是visual 6.0 c++,就在本网站下的,执行后得到1000以内的三个完数为6,28,496,结果正确。但是当我放大m到100000000时只增加了一个完数就是8128,在网上查33550336也是完数,但不知道为什么程序没有给出来。请老师解释一下,还有就是位数更多的完数应该怎样编程求出来比如:8589869056(10位),1 3 7438691328(12位),   2305843008139952128(19位)…… 因为这些已经超出了我的机器上长整型的最大值,是不是这些数只在大型机上才能求的出?
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-20 20:09:20 | 显示全部楼层
算法需要优化
刚我试了下 用个数组存质数
内层循环可以优化的
1,3,5,7,11,13
除以数组里的素数 能除尽 让素数乘以2继续除 这种优化
当数组非常小的时候还是很快的
但是数组大时 还是很慢 究其原因还是因为 第一层循环次数太多 就是再优化里面的 外面几百万上千万次循环 速度也是非常慢的
至于大数问题 可以看下别人写的10000阶乘怎么算的
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-20 20:09:35 | 显示全部楼层
算法需要优化
刚我试了下 用个数组存质数
内层循环可以优化的
1,3,5,7,11,13
除以数组里的素数 能除尽 让素数乘以2继续除 这种优化
当数组非常小的时候还是很快的
但是数组大时 还是很慢 究其原因还是因为 第一层循环次数太多 就是再优化里面的 外面几百万上千万次循环 速度也是非常慢的
至于大数问题 可以看下别人写的10000阶乘怎么算的
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-2-21 09:14:10 | 显示全部楼层
楼上的意思是不是说单从我的程序本身来看没有问题,只是因为数太大,算法没有优化,需要计算的时间太长所以出不来是吗?至于算法方面,因为我是刚刚学习C语言,所以对算法还没开始学,等对C语言有个大概的了解后再说。
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-11 11:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表