#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 对对对,我之前那个评论就是想说一个因数不会大于这个数的一半,不知道怎么就打错字了,非常感谢你的讲解
字符串输入输出函数 (C语言代码)浏览:2572 |
剪刀石头布 (C++代码)浏览:1808 |
C二级辅导-阶乘数列 (C语言代码)浏览:582 |
IP判断 (C语言代码)浏览:589 |
Quadratic Equation (C语言代码)浏览:1033 |
C语言程序设计教程(第三版)课后习题6.3 (C语言代码)浏览:493 |
找出最长的字符串来 (C语言代码)浏览:1826 |
C语言程序设计教程(第三版)课后习题8.1 (C语言代码)浏览:603 |
C语言程序设计教程(第三版)课后习题9.8 (C语言代码)浏览:601 |
C语言训练-字符串正反连接 (C语言代码)浏览:653 |