提问:为什么第二张代码运行不出来而第一张却可以呢?感觉没有区别呀呢


第二段代码,第二个for循环里将一个for循环的循环变量i进行了运算操作,让循环变量i的值发生了变化,所以导致运行出现了异常;
而第一段代码使用了另一个变量t来备份i的值,进行完数判断,而没有改变循环变量i的值, 所以可以正常运行。
测试如下:
参考链接:
完全数_百度百科
完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。如果一个数恰好等于它的真因子之和,则称该数为“完全数”。第一个完全数是6,第二个完全数是28,第三个完全数是496,后面的完全数还有8128、33550336等等。截至2018年,相关研究者已经找到51个完全数。
https://baike.baidu.com/item/%E5%AE%8C%E5%85%A8%E6%95%B0/370913?fromtitle=%E5%AE%8C%E6%95%B0&fromid=10876772&fr=aladdin
#include <stdio.h>
int main(void){
int range,t;
scanf("%d",&range);
for(int i=2;i<=range;i++){
t=i;
for(int j=1;j<i;j++){
// 这个if是当j为i的因子时,从t中减去j的值,循环结束,如果t为0
// 则表示i的所有真因子之和等于它本身,所以可以判断i为完数
if(i%j==0){
t=t-j; // 如果使用i的备份t来进行完数判断,不会影响第一个for循环的循环变量i的值,所以可以正确计算出完数
// i=i-j; // 这里如果直接使用i来进行完数判断,会导致第一个for循环的循环变量i发生变化,而导致出现错误
}
}
// https://baike.baidu.com/item/%E5%AE%8C%E5%85%A8%E6%95%B0/370913?fromtitle=%E5%AE%8C%E6%95%B0&fromid=10876772&fr=aladdin
if(t==0){
printf("%d ",i);
}
}
return 0;
}
