C++程序例题问题疑惑,求大神解答,不胜感激
21,计算并且输出10以内(包括10)的所有自然数的阶乘值。#include<stdio.h>intmain(){intn,k,s;for(n=1;n<=10;n=n+1...
21,计算并且输出10以内(包括10)的所有自然数的阶乘值。
#include<stdio.h>
intmain()
{
int n,k,s;
for(n=1;n<=10;n=n+1)
{ s=1;
for(k=1;k<=n;k=k+1)
s=s*k;
printf("%6d!=%d\n",n,s);
}
return 0;
}
(注:以上为正确答案,)问题:
如果把s=1放到外循环for(n=1;n<=10;n=n+1)的前面可以吗?为什么啊??
改变后程序如下:
#include<stdio.h>
intmain()
{
int n,k,s;
s=1;
for(n=1;n<=10;n=n+1)
{
for(k=1;k<=n;k=k+1)
s=s*k;
printf("%6d!=%d\n",n,s);
}
return 0;
}
只想求解详细原因解释,十分感谢,不胜感激 展开
#include<stdio.h>
intmain()
{
int n,k,s;
for(n=1;n<=10;n=n+1)
{ s=1;
for(k=1;k<=n;k=k+1)
s=s*k;
printf("%6d!=%d\n",n,s);
}
return 0;
}
(注:以上为正确答案,)问题:
如果把s=1放到外循环for(n=1;n<=10;n=n+1)的前面可以吗?为什么啊??
改变后程序如下:
#include<stdio.h>
intmain()
{
int n,k,s;
s=1;
for(n=1;n<=10;n=n+1)
{
for(k=1;k<=n;k=k+1)
s=s*k;
printf("%6d!=%d\n",n,s);
}
return 0;
}
只想求解详细原因解释,十分感谢,不胜感激 展开
展开全部
这个程序是求一组数字的阶乘,对于每个数的阶乘,其计算过程是这样的:
首先,给存放结果的变量s一个初始值1,s=1
第二,给控制变量k赋初值1,准备进行n阶计算
第三,判断控制变量k<=n?是则进入下步,不是则跳至第六步
第四,让s保存其与控制变量k的乘积,这样,第一次s=1,k=1,第二次k=2,s=1*2=2
第三次k=3,s=2*3,......一直到n,这样s里就存了从1到n有乘积。
第五,控制变量正加1,即k=k+1,转到第三步。
第六,输出计算阶乘的结果。
可以看出,对每个数的阶乘,首先要令s有一个初始值,如果按你所说,将s的赋值操作放在外循环,那么就无法使每次计算一个新的数阶乘时让s有一个初始值1.
事实上下面那处程序就是错在这里。由于在计算第一个数的阶乘之后,s即将保存上一个数的阶乘的结果,作为始值参与到下一个数的阶乘计算中来。
你看,
正确: 错误:
1!=1 1!=1
2!=2 2!=2
3!=6 3!12 (因为初值为2,所以计算成2*1*2*3=12)
4!=24 4!=288(因为初值为12,所以计算为12*1*2*3*4=288
首先,给存放结果的变量s一个初始值1,s=1
第二,给控制变量k赋初值1,准备进行n阶计算
第三,判断控制变量k<=n?是则进入下步,不是则跳至第六步
第四,让s保存其与控制变量k的乘积,这样,第一次s=1,k=1,第二次k=2,s=1*2=2
第三次k=3,s=2*3,......一直到n,这样s里就存了从1到n有乘积。
第五,控制变量正加1,即k=k+1,转到第三步。
第六,输出计算阶乘的结果。
可以看出,对每个数的阶乘,首先要令s有一个初始值,如果按你所说,将s的赋值操作放在外循环,那么就无法使每次计算一个新的数阶乘时让s有一个初始值1.
事实上下面那处程序就是错在这里。由于在计算第一个数的阶乘之后,s即将保存上一个数的阶乘的结果,作为始值参与到下一个数的阶乘计算中来。
你看,
正确: 错误:
1!=1 1!=1
2!=2 2!=2
3!=6 3!12 (因为初值为2,所以计算成2*1*2*3=12)
4!=24 4!=288(因为初值为12,所以计算为12*1*2*3*4=288
展开全部
不行的
//如果放外面的话就会把上一次结果给统计进来了,所以就不对。
intmain()
{
int n,k,s;
for(n=1;n<=10;n=n+1)
{
s=1;//赋初值
for(k=1;k<=n;k=k+1)//计算i的阶乘
s=s*k;
printf("%6d!=%d\n",n,s);
}
return 0;
}
//如果放外面的话就会把上一次结果给统计进来了,所以就不对。
intmain()
{
int n,k,s;
for(n=1;n<=10;n=n+1)
{
s=1;//赋初值
for(k=1;k<=n;k=k+1)//计算i的阶乘
s=s*k;
printf("%6d!=%d\n",n,s);
}
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
正确答案每次都for循环都将S置1,而你的S保留的是上次循环的结果,
第一次循环:n=1,k=1,s=1,result=1
第二次循环:n=2,第一次子循环s=1=s(1)*k(1);二次子循环:s=2=s(1)*k(2);
第三次循环:n=3,第一次子循环s=2=s(2)*k(1);二次:s=4=s(2)*k(2);三次:s=12=s(4)*k(3);
第四次循环:这次S的初始值是12哦,有兴趣自己推算吧!
.....
括号里是该变量的值。
明白了吧!
第一次循环:n=1,k=1,s=1,result=1
第二次循环:n=2,第一次子循环s=1=s(1)*k(1);二次子循环:s=2=s(1)*k(2);
第三次循环:n=3,第一次子循环s=2=s(2)*k(1);二次:s=4=s(2)*k(2);三次:s=12=s(4)*k(3);
第四次循环:这次S的初始值是12哦,有兴趣自己推算吧!
.....
括号里是该变量的值。
明白了吧!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
肯定不行啊。你s移到外面之后,算下一个数的阶乘的时候,s的初值是上一个数的阶乘的值了。比如你输出的3!=12了,为什么?就是因为s的初值这时变成2的阶乘的值2了,多乘了这个。
你算某个数比如n,当然是从1开始乘1*2*3*...n。而s移到外面之后相当于从上一次算的s的结果开始乘了,相当于n!=s*1*2**..n,这个结果怎么会对呢。所以在进入第二重循环之前s都要重新赋值为1
你算某个数比如n,当然是从1开始乘1*2*3*...n。而s移到外面之后相当于从上一次算的s的结果开始乘了,相当于n!=s*1*2**..n,这个结果怎么会对呢。所以在进入第二重循环之前s都要重新赋值为1
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询