2013-09-21 回答

#include

#include

void main ()

{

int i=1,c,i2=0;

do

{

/*修改1:i2是用来保存因子和,那么每次循环前都应该将i2置零*/

i2=0;

/*修改2:你这里原先的做法是不对的,你让c=0,然后进行了循环判断,循环体里面c首先+1,然后进行整除判断

这样的话你的确是从1开始整除判断的,但是对于c,它满足sqrt(i)>c,但是执行完c=c+1之后呢?

你下面进行整除判断的是在执行完c=c+1之后,也就是说你的循环体检查范围是在检查c,而判断整除却是在判断c+1,

改成我下面这样就OK了,下面那个输出质数也是同样的问题,就不在哪里啰嗦了*/

c=1;

while(sqrt(i)>c)/*求因子和*/

{

if(i%c==0) { i2=i2+c+i/c; }

c=c+1;

}

/*修改3:完数的定义是真因子(除去该数字本身后的因子)和等于该数字本身的数,

按照你的思路,在将c=1加入i2的时候也会将i/c=i/1=i也加入i2,可以通过事后从i2中减去i来修正*/

i2=i2-i;

/*修改4:求因子和的时候没有考虑i是平方数,也就是sqrt(i)也是i的因子的情况,

这里按照你的思路改起来有点麻烦*/

if(sqrt(i)==(int)sqrt(i))/*先判断平方根是不是整数,原因要解释再问我...*/

{

if(i%((int)sqrt(i))==0) { i2=i2+sqrt(c); }/*再判断能不能整除*/

}

/*修改5:你在判断的时候i*2是什么意思呢?*/

if(i2==i)/*判断*/

{

printf("完数%d\nits factors are  ",i2);/*输出完数*/

c=1;

while(i-1>c)

{

if(i%c==0) { printf("%d.",c); }/*输出因子*/

c=c+1;

}

/*修改6:这句应该放在上面那个while外面,每输出一个完数就输出一个回车,将它们分隔开来*/

putchar('\n');

}

/*修改7*:这句一定要放在外面,原先被你放在了判断它是完数那里面了,按照你的也就是只有在i是完数

的时候它才+1,那如果i不是完数,整个循环体就一直在对这个i循环,那就死循环了*/

i=i+1;               /*循环*/

}while(i<=1000);

}

/*至于为什么会出现你那个问题,你这里面错误太多了,懒得分析了--!,蛋疼我写这么多还不采纳就没天理了*/

追问:

嗯 输出因子 你有什么好的想法呢?我书才看了100页多,就用最基本的语言怎么搞出因子,我觉得上面这个确实没麻烦,还有真的感谢你为我写了那么多行代码,一定仔细参考。

追答:

检查因子没有什么高效的算法,像上面那样一个个试就可以了,不过有几个小问题

你是对每个i检查是否有c

这是需要时间的,你循环体循环多少次就要调用多少次sqrt,这就造成了重复计算,浪费了时间

解决方法之一是一开始就计算用并一个double保存sqrt(i),然后循环体直接对保存的值进行判断

不过我一般是判断通过c*c<=i来判断的,这样就不要很麻烦的对sqrt(i)进行一次特判

另外不知道你看了数组没有?如果学了数组的话还有一个小改进

就是你在判断他是不是完数的时候进行一次因子判断,这是为了求因子和

当他是完数的时候你又要进行一次因子判断,为了输出因子

其实这里可以用一个数组来保存第一次进行因子判断时获得的因子

这样在输出因子的时候就可以直接把数组里面保存的数据输出了

都是一些小改进,但也不容忽视,大体方向是没有错的

追问:

确实 我觉得 循环时判断结束条件是这一章最最重要的,可能以后也是难点。现在先基本了解一些,谢谢你 仔细的回答。以后有问题再求教你,加50分。

1000以内完数c语言程序_求1000以内完数 c语言 。。相关推荐

  1. 五位回文数质数c语言程序,(1)求既是回文数又是质数的五位十进制数。

    判断质数函数 //判断是否是素数 bool_isPrime(int num) { int i; int temp = sqrt(num); for(i=2;i if(num % i==0) retur ...

  2. C语言学习之一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1,2,3,而6=1+2+3,因此6是“完数”。编程序找出1000之内的所有完数。

    一个数如果恰好等于它的因子之和,这个数就称为"完数".例如:6的因子为1,2,3,而6=1+2+3,因此6是"完数".编程序找出1000之内的所有完数,并按下面 ...

  3. 一个数如果恰好等于它的因子之和,这个数就称为“完数“。例如,6的因子1,2,3而6 = 1+2+3,因此6是完数。编程序找出1000之内的所有完数

    一个数如果恰好等于它的因子之和,这个数就称为"完数".例如,6的因子1,2,3而6 = 1+2+3,因此6是完数.编程序找出1000之内的所有完数 #include <std ...

  4. C++中如何读取一个数的位数_求1000以内的水仙花数

    点击上方 蓝字关注我们 大家好,我是阿汤哥. 看知乎上有朋友说还不明白怎么判断水仙花数,今天我们就来看看这个问题.(PS:"求1000以内的水仙花数"这道题阿汤哥记忆犹新.到现在还 ...

  5. 可运行的C语言程序的拓展名,可运行的c语言程序的扩展名为什么?

    可运行的c语言程序的扩展名为".exe".c语言程序经过"编译程序"编译之后,生成一个后缀为".obj"的二进制文件:然后由"连接 ...

  6. c语言体积的单词,C语言程序:求常用圆形体的体积

    <C语言程序:求常用圆形体的体积>由会员分享,可在线阅读,更多相关<C语言程序:求常用圆形体的体积(3页珍藏版)>请在人人文库网上搜索. 1.C语言程序:求常用圆形体的体积求常 ...

  7. c语言编程1 1=2,编写一个C语言程序:求S=1/1+1/2+1/3+…+1/n

    编写一个C语言程序:求S=1/1+1/2+1/3+-+1/n以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 编写一个C语 ...

  8. 帮我用c语言写一个求1000以内质数的程序

    很高兴为您服务!我可以为您编写一个用C语言求1000以内质数的程序,代码如下: #include<stdio.h> int main() { int n, i, j, flag; prin ...

  9. c语言程序找出500以内的所有素数,c语言求出给定范围内的所有质数

    程序功能: 输入一个整数,要求打印出这个整数以内的所有质数. 程序示例: #include #include #include bool IsPrime(int x) { bool bResult = ...

  10. 模型预测控制c语言程序_搭建第一个程序控制电路LED灯,体会C语言的魅力

    学习C语言,先从读程序开始!这一点是过来人的经验之谈.本文建议大家选择一款图形编程软件,本文选择了Mixly. 一.首先,介绍一下arduino UNO控制器内部电压的问题. v 高电平(5V):对应 ...

最新文章

  1. DongLiORM 第二次更新
  2. 如何反序列化XML文档
  3. React Native 0.59.0 发布,使用 React 编写原生应用
  4. Java编程基础篇第二章
  5. 环境污染,拿什么来保障食品安全?
  6. 利用FPGA加速实现高性能计算
  7. Java项目打包成exe的详细教程
  8. ansj 自定义 停用词_构造自定义停用词列表的快速提示
  9. Flutter时间工具类封装
  10. raster | R中的栅格操作符(上)[翻译]
  11. 基于spi FLASH的嵌入式文件系统 littlefs(转)
  12. Linux下mysql主从复制配置(CentOS7)
  13. html5动画在线制作工具,KoolShow-KoolShow(HTML5动画制作工具) v2.4.4 官方版-CE安全网...
  14. GeoServer地图开发解决方案(二):地图数据处理篇
  15. 国外NetDevOps资源工具清单分享
  16. 高分辨率图像剪切——目标检测
  17. Number of ways to split should evenly divide the split dimension, but got split_dim 3 (size = 4) and
  18. 学习Python的做笔记神器——Jupyter Notebook
  19. 银心科技与黑萤科技达成战略合作,联合构建区块链数据库存储生态至高点
  20. 边框,多层背景,内补白与外补白

热门文章

  1. sony android mp3播放器,劲能小钢炮!Sony ZX505 播放器动耳听:云音乐也HiFi
  2. CAN数据格式-ASC
  3. promise对象---【阮一峰ES6】
  4. 安卓投屏大师_【投屏】全平台全设备无线投屏工具幕享
  5. JAVA一键获取文件名并对比Excel名单,看看谁没有交作业
  6. linux视频补帧,SVP补帧软件最新版-SVP补帧软件免费版-QQ下载站
  7. RF射频技术-si4438C芯片介绍
  8. uv422转换为yuv420_YUV420 Planar 转换为 YUV422 Packed
  9. STM32与4脚光敏电阻的简单使用——初学
  10. 了解数据库(包括数据库发展史、分类、著名人物、主流数据库、关系与非关系型数据库)