#include<stdio.h> #include<math.h> int main(void) { int n; int i,j; int sum=1; scanf("%d",&n); for(i=2;i<=n;i++) { for(j=2;j<=(int)sqrt(i);j++) if(i%j==0) { if(i/j==j)sum+=j; else sum +=i/j + j; } if(sum==i) { printf("%d its factors are",i); for(j=1;j<i;j++) if(i%j==0)printf(" %d",j); printf("\n"); } sum=1; } return 0 ; }
0.0分
2 人评分
if(i/j==j)sum+=j; else sum +=i/j + j; 什么意思啊
Lkdna 2018-07-17 14:32:58 |
如果相同加一个,不同加两
为什么是j<=(int)sqrt(i)呢而不是直接小于i呢?谢谢
j<=(int)sqrt(i)这句话是什么意思??
海洋之心 2017-07-28 16:51:12 |
sqrt是开平方, 该函数返回值是double 类型, 我这里使用了强制类型转换
小小琛 2018-01-26 18:47:49 |
一个数的最大的因数不会超过这个数的一般,所以用了开平方根
小小琛 2018-01-26 18:48:12 |
应该是这样,如果我说的不对,麻烦回复我
NiKlous 2018-02-01 16:46:45 |
@liangchenyu 你说的不对,16的因数最大(不包括自身)是8,8>4
小小琛 2018-02-02 15:03:53 |
@NCL 那这个sqrt的优化原理是啥啊0.0
NiKlous 2018-02-02 20:11:35 |
计算次数比从1数到i要少。过程解释:如果i/j==j,说明i是j的平方,只取一个j;如果i/j!=j,说明两个因数不同,所以加上i/j + j
NiKlous 2018-02-02 20:13:39 |
@liangchenyu 这里还可以改为1到i/2,(一个数的因数不会大于这个数的一半)
小小琛 2018-02-03 21:48:46 |
@NCL 对对对,我之前那个评论就是想说一个因数不会大于这个数的一半,不知道怎么就打错字了,非常感谢你的讲解
简单的a+b (C语言代码)浏览:641 |
【简单计算】 (C语言代码)浏览:642 |
C语言程序设计教程(第三版)课后习题8.4 (C语言代码)浏览:631 |
Wu-求圆的面积 (C++代码)浏览:1994 |
C语言程序设计教程(第三版)课后习题6.3 (C++代码)浏览:1067 |
DNA (C语言代码)浏览:798 |
C语言程序设计教程(第三版)课后习题9.4 (C语言代码)浏览:724 |
The 3n + 1 problem (C语言代码)浏览:550 |
钟神赛车 (C语言代码)浏览:665 |
企业奖金发放 (C语言代码)浏览:2459 |