这个程序有什么问题,
求1的阶乘加2的阶乘加3的阶乘一直加到n的阶乘的和
为什么运行后出现的答案不对
是哪里有错
是 %ld ,long decimal的缩写,不是1d
不知道你这个问题是否已经解决, 如果还没有解决的话:写一个函数用来判断一个数里面有多少个1,并定义全局变量,记录1的个数。在主函数中只需要遍历所有的数,就可以找到所有的数中有多少个1。
代码呈上:
#include <stdio.h>
int sum=0;
void f(int n)
{
int a;
while(n>0)
{
if(n%10==1)
sum++;
n/=10;
}
}
int main ()
{
int n;
scanf("%d",&n);
int i;
for(i=1;i<=n;i++)
{
f(i);
}
printf("%d",sum);
return 0;
}
运行示例
在参考资料中并没有提到计算阶乘之和的程序,因此需要自己推导一下。
在程序中,计算1的阶乘,2的阶乘,3的阶乘,......,n的阶乘,并将它们求和,在运算结果就是我们需要的答案。
阶乘可以用循环或递归实现,这里以循环实现为例。
程序如下:
#include <stdio.h>
int factorial(int n){
int result = 1;
for(int i=1;i<=n;i++){
result *= i;
}
return result;
}
int main(){
int n;
long long ans = 0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
ans += factorial(i);
}
printf("%lld\n",ans);
return 0;
}
这个程序基本没有什么问题,但考虑到阶乘很容易就溢出了,可以将程序改进为累乘的形式,避免溢出。
修改后的程序如下:
#include <stdio.h>
long long multiply(int n){
long long result = 1;
for(int i=1;i<=n;i++){
result *= i;
}
return result;
}
int main(){
int n;
long long ans = 0;
scanf("%d",&n);
long long prev = 0;
for(int i=1;i<=n;i++){
prev *= i-1;
ans += prev + multiply(i);
}
printf("%lld\n",ans);
return 0;
}
第一次进入循环时,结果为 $0+1=1$。但由于我们需要 $0!$ 的值才能计算 $1!$,因此需要在累乘的过程中将 $0!$ 的值一并计算,这样第二次进入循环时就不需要重新计算 $0!$ 了,直接使用即可。
注意,由于计算 $0!$ 时需要将其规定为 $1$,代码中的 prev 初始化为 $0$。