C语言 做累加的过程中答案出错了
我今天在网页上看到有个兄弟求一个C程序1到25的各数阶乘和。于是便写出了下面的程序。但是我发现,答案是错误的。因为,1到25的阶乘和其个位数一定是3.而这个程序运行得到的...
我今天在网页上看到有个兄弟求 一个C程序 1到25 的各数阶乘和。
于是便写出了下面的程序。但是我发现,答案是错误的。因为,1到25的阶乘和 其个位数一定是 3.而这个程序运行得到的结果 个位、十位、百位等好几位都是 0 。
我想这应该是加法器的数据溢出所造成的后果。
如果我的猜想是对的,那么怎么解决 这个计算过程中,加法器溢出的问题。
如果我的猜想是错误的,那么是什么原因造成了 计算结果错误呢?又该怎样解决?
希望大侠指点迷津啊。
请 给出相关解决方案,并改善我的这个程序,使输出结果能精确到个位。
小弟这厢有礼了。~~~~~
#include <stdio.h>
void main()
{
int i,j;
double a[25],b[25];
double ans=0;
for(i=0;i<25;i++)
{ a[i]=i+1;
b[i]=a[i];
for(j=1;j<i;j++)
b[i]=(a[i]-j)*b[i];
ans=ans+b[i];
}
printf("\nans=%f\n",ans);
} 展开
于是便写出了下面的程序。但是我发现,答案是错误的。因为,1到25的阶乘和 其个位数一定是 3.而这个程序运行得到的结果 个位、十位、百位等好几位都是 0 。
我想这应该是加法器的数据溢出所造成的后果。
如果我的猜想是对的,那么怎么解决 这个计算过程中,加法器溢出的问题。
如果我的猜想是错误的,那么是什么原因造成了 计算结果错误呢?又该怎样解决?
希望大侠指点迷津啊。
请 给出相关解决方案,并改善我的这个程序,使输出结果能精确到个位。
小弟这厢有礼了。~~~~~
#include <stdio.h>
void main()
{
int i,j;
double a[25],b[25];
double ans=0;
for(i=0;i<25;i++)
{ a[i]=i+1;
b[i]=a[i];
for(j=1;j<i;j++)
b[i]=(a[i]-j)*b[i];
ans=ans+b[i];
}
printf("\nans=%f\n",ans);
} 展开
4个回答
展开全部
//这个是高精度的阶乘函数,返回值:阶乘结果的位数
//本程序直接输出n!的结果,需要返回结果请保留桐亩long a[]
//需要 math.h
所梁芹以你如果要写相应的加法的话,就把long a[]数组设置为全局变量。然后用个b[]数组来存放加了之后的结果。每次用factorial(int n)求出阶乘的结果放在a[]时就加到b数组上就可以了。最后再输出就可以了。不过还是得学过高精度才会写的。现在有点手生了,就不帮你写了。自己动手写还是很有好橡轮毕处的
int factorial(int n)
{
long a[10000];
int i,j,l,c,m=0,w;
a[0]=1;
for(i=1;i<=n;i++)
{
c=0;
for(j=0;j<=m;j++)
{
a[j]=a[j]*i+c;
c=a[j]/10000;
a[j]=a[j]%10000;
}
if(c>0) {m++;a[m]=c;}
}
w=m*4+log10(a[m])+1;
printf("\n%ld",a[m]);
for(i=m-1;i>=0;i--) printf("%4.4ld",a[i]);
return w;
}
//本程序直接输出n!的结果,需要返回结果请保留桐亩long a[]
//需要 math.h
所梁芹以你如果要写相应的加法的话,就把long a[]数组设置为全局变量。然后用个b[]数组来存放加了之后的结果。每次用factorial(int n)求出阶乘的结果放在a[]时就加到b数组上就可以了。最后再输出就可以了。不过还是得学过高精度才会写的。现在有点手生了,就不帮你写了。自己动手写还是很有好橡轮毕处的
int factorial(int n)
{
long a[10000];
int i,j,l,c,m=0,w;
a[0]=1;
for(i=1;i<=n;i++)
{
c=0;
for(j=0;j<=m;j++)
{
a[j]=a[j]*i+c;
c=a[j]/10000;
a[j]=a[j]%10000;
}
if(c>0) {m++;a[m]=c;}
}
w=m*4+log10(a[m])+1;
printf("\n%ld",a[m]);
for(i=m-1;i>=0;i--) printf("%4.4ld",a[i]);
return w;
}
展开全部
是高精衡租扮度问题,下面这个程序是求N!咐灶 的程序,你要求 阶乘和,可以试着写下高精度加法函数,这是最好写的,型答如果有问题可以继续讨论。。。。。
#include<stdio.h>
#define M 10000
#define N 2000
int p=1;
void integer_product(int *a,int n)
{
int i,j,k;
for(j=2;j<=n;j++)
{
k=0;
for(i=0;i<p;i++)
a[i]*=j;
for(i=0;i<p;i++)
{
a[i]+=k;
k=a[i]/M;
a[i]%=M;
}
if(k)
{
p++;
a[p-1]+=k;
}
}
printf("%d",a[p-1]);
for(i=p-2;i>=0;i--)
printf("%04d",a[i]);
printf("\n");
}
int main()
{
int a[N]={0},n,i;
while(scanf("%d",&n),n)
{
for(i=0;i<N;i++)
a[i]=0;
a[0]=1;p=1;
integer_product(a,n);
}
return 0;
}
#include<stdio.h>
#define M 10000
#define N 2000
int p=1;
void integer_product(int *a,int n)
{
int i,j,k;
for(j=2;j<=n;j++)
{
k=0;
for(i=0;i<p;i++)
a[i]*=j;
for(i=0;i<p;i++)
{
a[i]+=k;
k=a[i]/M;
a[i]%=M;
}
if(k)
{
p++;
a[p-1]+=k;
}
}
printf("%d",a[p-1]);
for(i=p-2;i>=0;i--)
printf("%04d",a[i]);
printf("\n");
}
int main()
{
int a[N]={0},n,i;
while(scanf("%d",&n),n)
{
for(i=0;i<N;i++)
a[i]=0;
a[0]=1;p=1;
integer_product(a,n);
}
return 0;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
绝对要溢出的。
实数没有意义,因为你要精确到个位。C没有大整数支持,只好自己手工编大整数的加、乘法及打印来实现。比纤纳如用数组表示毁兄没大整数,每元素表示整数的十进一位。尘知
实数没有意义,因为你要精确到个位。C没有大整数支持,只好自己手工编大整数的加、乘法及打印来实现。比纤纳如用数组表示毁兄没大整数,每元素表示整数的十进一位。尘知
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我也不知道为什么会这样,但是你如果把数值改成long型的,
那个结果就是对的了吧!
那个结果就是对的了吧!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询