如何用C语言解决多组阶乘和的问题(1!+ 2!+ 3!+ ... + n!的和)

问题如题,详细要求如下:

编写程序,计算并输出1!+ 2!+ 3!+ ... + n!的和s,再判断s中是否含n。若含n,输出1,否则输出0。其中n的取值范围为1~9。

输入:输入正整数n,n的取值范围为1~9。

输出:在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后6位。题目保证计算结果不超过双精度范围。

          1、输出1!+  2!+ 3!+ ... + n!的和s;

           2、输出s中是否含n的判断结果,若含n,则输出1,否则输出0。

本人首先依据数学思维编写了一段代码,如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int i , n , j , a , b , c;
	long p, sum = 0;
	scanf("%d",&n);
	for (i = 1; i <= n; i = i++)//先把阶乘长式子里的1,2,3.....n表示出来
	{
		p = 1;/*注意!!!每执行完一次循环,p的值重归于1!*/
		for(j = 1;j <= i;j = j++)//这里的j其实就是阶乘中的各个元素:1*2*3....中的1,2,3...
		{
			p = p * j;//p初始是1,1*j(这里j还是1,下一步运算里变为2)先赋值给新p,再p*2再次赋值给p
					//简单来说:p = 1*1 ——> p = 1*2 ——> p = 2*3 ——> p = 6(2*3所得)*4 ——> p = 2*3*4*5...
					//以此类推,p就是一个确定的数的阶乘
					//而这个确定的数就是前面提到的 “i”
					//i有多个,那么每个i对应的p就有多个,p = i!。
		}
			sum = sum + p;//每得到一个新p就进行累和:1!+ 2!+ 3!......
	}
	
	printf("%d\n",sum);//打印最后结果
	a = sum / 100;//求百位数字
	b = sum / 10 % 10;//求十位数字
	c = sum % 10;//求个位数字
	if (n == a || n == b || n == c)//如果输入的n在最终结果的数字中能找到
		printf("1\n");
	else
		printf("0\n");
	return 0;
}

请仔细阅读代码中的注释,当然,上述代码的数学逻辑较重,那有没有更加简洁的解决方法呢,当然有,请看下面滴另一个解决方案。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() 
{
    /*sum变量用来保存阶乘之和
       s是一个累乘器,用来获得阶乘结果*/
    int sum = 0, s = 1, n, i, a , b , c;
    //输入n
    scanf("%d", &n);
    //执行for循环
    for (i = 1; i <= n; i++) 
    {
        /*先进行累乘,比如i=1时,s=1*1,同理,
          i=2时候,s=1*2,再同理,i=3的时候,
          i=2*3......相当于我每次累乘就获得了
          第i个数的阶乘,这样就可以直接进行求
          和了
         */
        s = s * i;
        //求和
        sum = sum + s;
    }
    //输出结果
    printf("%d\n", sum);//打印最后结果  
    a = sum / 100;//求百位数字  
    b = sum / 10 % 10;//求十位数字  
    c = sum % 10;//求个位数字  
    if (n == a || n == b || n == c)//如果输入的n在最终结果的数字中能找到  
        printf("1\n");
    else
        printf("0\n");
    return 0;

}

两串代码的输出结果完全一样,如下

那么这串代码就只使用了一次for循环就解决了问题,岂不美哉?

希望这篇文章能对你有所帮助,当然了,如果你在阅读过程中发现了问题,欢迎指正!感谢阅读!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值