//寻找完数
int wan(int n) {
int i = 0, t = 0;
for ( ; i < n; i++) {
if (n % i == 0) {
t += i;
}
}
return t;
}
这里,我定义的函数wan的目的就是找到变量n的所有因子并求和,但是,因为我初始化的i=0,导致条件n%i==0本身就会报错,所以初始化变量也要先考虑下
修复除以零的错误:
- 循环应从
1
开始,而不是0
。
所以,i = 0
检查范围:
- 你可以将循环的范围改为
i <= n / 2
,因为一个数的因子(这里题目的条件是不含n本身这个因子)不会超过其一半
所以,i<= n/2 (记住,这里必须取等!否则可能漏掉n/2这个结果)
这样只是可以提高代码效率,但是写i<n没有任何问题!相反,如果你不熟练或者没有对n/2取等号成立,就一定会出现错误
int wan(int n) {
int i = 0, t = 0;
for (i = 1; i < n/2; i++) {
if (n % i == 0) {
t += i;
}
}
return t;
}
int main() {
int N = 0;
scanf_s("%d", &N);
for (int i = 0; i < N; i++) {
if (wan(i) == i) {
printf("%d\n", i);
}
}
return 0;
}
修改后还是会多出0这个数,这是为什么?
且看主函数中的int i=0 这样,wan(0)在函数wan里面不会进入循环,直接return返回t的初始化值0,所以wan(0)== 0成立,所以会输出不必要的值0
正确做法是将for里面的int i=0改为int i=1
int wan(int n) {
int i = 0, t = 0;
for (i = 1; i <= n/2; i++) {
if (n % i == 0) {
t += i;
}
}
return t;
}
int wans(int n) {
int i = 0, t = 0;
for (i = 1; i <= n/2; i++) {
if (n % i == 0) {
printf("%d ", i);
}
}
}
这里粘贴复制的wans的目的是输出这个完数的因子,但是会导致错误
wans函数的返回类型应该改为 void
,因为它只负责打印因子,不需要返回值
所以,void wans(int n)
而且,你在wans函数中已经加上了printf输出函数,运用时只需要
printf("%d its factors are ",i);
wans(i);
printf("\n");
//就像斗在一起样
//这道题做得好顺手 😘😘
再来看看这个
有一分数序列: 2/1 3/2 5/3 8/5 13/8 21/13...... 求出这个数列的前N项之和,保留两位小数
int main() {
int n = 0, sn = 0;
scanf_s("%d", &n);
for (int i = 0; i < n; i++) {
double a = 2.0, b = 1;
double c = a / b;
sn += c;
int a1 = a;
a = a + b;
b = a1;
}
printf("%.2f", sn);
return 0;
}
结果还是出错,让我很诧异,以为可以一遍过的
问题出在哪里?原来是我的double a = 2.0, b = 1;定义在for循环内部,那这样我求和后a和b的值每次循环都又被重新定义成2和1嘛! 所以,将这行代码移到上面,即循环外部
同时,还有个小错误,那就是sn,我图省事写了int n = 0, sn = 0;但是,苍天!这个sn就是求和sum,我是要和双精度浮点数求和的,而且还用了%.2f来输出结果,所以,sn = 0;必须改成double sn=0;
//同时补充一点,单精度/双精度浮点数都是已经被编译器确定了浮点数范围的,写成double sn=0就行了,不必double sn = 0.00;编译器会帮助你
今天这两个题都挺顺手,haha
Comments NOTHING