问题如题,详细要求如下:
编写程序,计算并输出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循环就解决了问题,岂不美哉?
希望这篇文章能对你有所帮助,当然了,如果你在阅读过程中发现了问题,欢迎指正!感谢阅读!