10.19 上午 练习笔记

发布于 3 天前  21 次阅读


//寻找完数
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

届ける言葉を今は育ててる
最后更新于 2024-10-19