C语言N阶乘求和溢出问题

#include <stdio.h>
#include <stdlib.h>

int main()
{
unsigned int k=1,i,n,s=0;
scanf("%d",&n);
for(i=1; i<=n; i++)
{

k=k*i;

s+=k;
}
if(k!=0&&s>0&&k
>0)
printf("%u",s);
else
puts("overflow");
return 0;
}
Description
求1!+2!+…+k!=?,并判断是否溢出。

Input
输入为一个正整数k。

Output
若1!+2!+…+k!的值溢出unsigned(无符号整型)的范围输出“overflow”,否则输出1!+2!+…+k!的结果。

Sample Input
5
Sample Output
153
HINT

如果一个值溢出某个变量的数据类型存储范围,但仍然存入该变量,那么存入该变量中的值实际上是什么?
#include <stdio.h>
#include <stdlib.h>

int main()
{
unsigned int k=1,i,n,s=0,j=0,count=0;
scanf("%d",&n);
for(i=1; i<=n; i++)
{

k=k*i;
j=s;
s+=k;
if(j>s)
{

printf("overflow");
count=1;
break;
}
}
if(count==0)
printf("%u",s);
return 0;
}

改成这样还不对

#include <stdio.h>
#include <stdlib.h>

int main()
{
unsigned int k=1,i,n,s=0;
scanf("%d",&n);
for(i=1; i<=n; i++)
{

k=k*i;

s+=k;
}
if(k!=0&&s>0&&k
>0)
printf("%u",s);
else
puts("overflow");
return 0;
}
Description
求1!+2!+…+k!=?,并判断是否溢出。

Input
输入为一个正整数k。

Output
若1!+2!+…+k!的值溢出unsigned(无符号整型)的范围输出“overflow”,否则输出1!+2!+…+k!的结果。

Sample Input
5
Sample Output
153
HINT

如果一个值溢出某个变量的数据类型存储范围,但仍然存入该变量,那么存入该变量中的值实际上是什么?在vdszdf
温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-01-14
使用数组,下面的代码是根据计算数的大小,动态分配内存。最大可计算(10^9 -1)! 计算10000的阶乘只要0.5秒!!(计算数n&num小于10^9时,数据类型可以设置为long)

#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<time.h>
long t=2,a,m;
long long b;
main()
{
///////////////////// prepare /////////////////////
long num = 0;
while(1){
printf("Input a natural number that you want to get its factorial.\n");
scanf("%ld",&num);
getchar();
if(num <0){
printf("Your Input is illegal!\n");
}
else{
break;
}
}
long n = 1000000000; //如果b,s不使用long long数据类型,n&num应不大于10^9,否则出错。
///////////////////// ready ////////////////////////
// 按sizeof(long)==4,sizeof(long long)==8算,
//最大可计算(10^9 -1)! 要求内存够大哦^_^
long long *s = (long long*) malloc(sizeof(long long)*num);
if(NULL == s){
perror("malloc");
return -1;
}
memset(s,0,sizeof(long long)*num);
s[0] = 1;
double start,finish;
start = clock();//计时开始
for(t=2;t<=num;t++){
for(a=0;a<=m;a++){
s[a]=(b+=s[a]*t)%n,b/=n;
if( (m==a) && b)m++;
}
}
for(printf("%d!=%lld",num,s[m]);m--;)printf(“%09lld",s[m]);
printf("\n");

finish = clock();//计时结束
printf("Spended %f seconds to calculate.\n",(finish-start)/CLOCKS_PER_SEC);
free(s);
#if 0
FILE *fp;//也可以输出到文件
if((fp = fopen("/example/save","w+"))==NULL){
printf("open save file error\n");
}
else{
for(fprintf(fp,"%ld",s[m]);m--;)fprintf(fp,"%09ld",s[m]);
}
free(s);
#endif
return 0;
}
第2个回答  推荐于2018-03-08
该变量能够接受的长度的内容!!
比如,1100 0100 1011 0101 1101,如果发生溢出,变量只能存两个字节的话,那就只能保存后面的16位了,前面的4位将被舍弃!本回答被网友采纳
第3个回答  2011-11-07
你要判断存储阶的值是否超出65535,只要跟65535相减,负数的值就是你超出范围的值
第4个回答  2011-11-06
达到最大值后会变成最小值,如果加上一个k!后变小了,应该可以说明溢出了。追问

#include
#include

int main()
{
unsigned int k=1,i,n,s=0,j=0,count=0;
scanf("%d",&n);
for(i=1; is)
{

printf("overflow");
count=1;
break;
}
}
if(count==0)
printf("%u",s);
return 0;
}

还是不行啊

追答

哪儿不对啊?我运行正常啊,而且到了15开始溢出也对啊。

追问

我改成这样交上去,系统不接受!!!

追答

晕,我的编译器都正常运行了,而且结果也没问题,怎么会不接收,你们是交作业吗?