[英]Why the place of the assignment of a variable is so important? [C]
在尝试解决Kochan的练习-C书中的编程(第4循环章节)时,问题是要写出前10个阶乘数。 我试图用嵌套循环来解决它,但是结果是一个完全的垃圾。 我抬起头,发现一种解决方案与我的非常相似,但是我注意到变量的位置不同。
先前的解决方案:
/*This program calculates the first 10 factorials*/
#include <stdio.h>
int main(void){
int n,i;
unsigned long int fact=1;
printf(" n\t\t n!\n");
printf("---\t\t--------\n");
for(n=1; n<=10; n++){
for(i = 1; i<=n; i++){
fact*=i;
}
printf("%2d\t\t%7ld\n",n,fact);
}
return 0;
}
输出:
./factorial
n n!
--- --------
1 1
2 2
3 12
4 288
5 34560
6 24883200
7 857276416
8 -511705088
9 1073741824
10 0
固定解决方案:
/*This program calculates the first 10 factorials*/
#include <stdio.h>
int main(void){
int n,i;
printf(" n\t\t n!\n");
printf("---\t\t--------\n");
for(n=1; n<=10; n++){
unsigned long int fact=1;
for(i = 1; i<=n; i++){
fact*=i;
}
printf("%2d\t\t%7ld\n",n,fact);
}
return 0;
}
输出:
./factorial
n n!
--- --------
1 1
2 2
3 6
4 24
5 120
6 720
7 5040
8 40320
9 362880
10 3628800
注意,唯一的区别是该变量事实在第二个解决方案中是局部的,而在前一个解决方案中是全局的。
所以我想这个问题现在已经澄清了,为什么只改变位置似乎可以解决问题? 为什么存在将变量放在首位的问题? 提前致谢 !
因为在n上的每次迭代期间,变量都被设置为1。如果在迭代n的循环开始时将其设置为1,则可以像在第一个代码中一样声明它。 。
问题不仅仅在于变量的声明位置和初始化位置 。 在正确的代码中, fact
对于每个新n
都设置为1
,以便“重新开始”并计算阶乘。 在您的代码中,您无需重置fact
,因此它将继续保留前n
剩余的值,因此您正在计算n! 乘以先前的结果。
另一种解决方案是删除内部循环,并利用n ! = n ×( n -1)!。 (这也会表现更好。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.