高分求一道很基础的C语言题
一个编程题:求(1!+2!+3!+4!+......+100!),1的阶乘到100的阶乘之和累加,分不是问题,谢谢各位大侠了,考试要用到这个!!!...
一个编程题:求(1!+2!+3!+4!+......+100!),1的阶乘到100的阶乘之和累加,分不是问题,谢谢各位大侠了,考试要用到这个!!!
展开
10个回答
展开全部
这个问题的关键之处就是大整数的乘法问题了,给你一个大整数乘法的C程序,你可以在此基础上自己添加一个累加函数以达到你的目的:
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void prt(const int *a,int size)
{
int i;
for (i = 0; i<size; i++) {
printf("%u",a[i]);
}
putchar('\n');
}
void mst(int *rt,int len,const int *a,int lena,const int b,const int index)
/*计算保存在数组中的整数a与一个小于10的自然数b的乘积,结果保存到rt数组中,index表示b是整个乘法中乘数的第几位*/
{
int i;
int j;
for (i=len-index-1,j=lena-1; j>=0; --j,--i) {
rt[i]+=a[j]*b;
rt[i-1]+=rt[i]/10;
rt[i]%=10;
}
}
int *tran(const char *a)
{
int i,*rt,lena=strlen(a);
rt=malloc(sizeof(int)*lena);
for (i = 0; i<lena; i++) {
rt[i]=a[i]-48;
}
return rt;
}
int *mt(const char *a,const char *b,int *len)
/*返回两个大整数的积,两个大整数以字符串的型式保存在a和b数组中,返回保存相乘结果的整型数组地址,结果的长度由指针len带回*/
{
int i,j,lena=strlen(a),lenb=strlen(b),lenm;
int *ta,*tb,*tc,*mu;
lenm=lena<lenb?lena:lenb;
mu=malloc((lena+lenb)*sizeof(int));
if (lena>=lenb) {
ta=tran(a);
tb=tran(b);
}
else{
i=lena;
lena=lenb;
lenb=i;
ta=tran(b);
tb=tran(a);
}
tc=calloc(lena+lenb,sizeof(int)); /*tc数组保存最终的计算结果*/
for (i = 0; i<lenm; i++) { /*模拟笔算过程,保存每一位的乘积*/
memset(mu,0,(lena+lenb)*sizeof(int));
mst(mu,lena+lenb,ta,lena,tb[lenb-1-i],i);
for (j = lena+lenb-1; j>=0; j--) {/*将每一位的乘积相加,得到最终的结果*/
tc[j]+=mu[j];
if (j>0) tc[j-1]+=tc[j]/10;
tc[j]%=10;
}
}
free(ta);
free(tb);
free(mu);
*len=lena+lenb;
return tc;
}
int main(void)/*调用示例*/
{
char numa[]="123456789123456789",numb[]="9876543219876543210";
int len,*a;
a=mt(numa,numb,&len);/*计算numa和numb和乘积*/
prt(a,len);/*输出计算结果*/
free(a);
return 0;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void prt(const int *a,int size)
{
int i;
for (i = 0; i<size; i++) {
printf("%u",a[i]);
}
putchar('\n');
}
void mst(int *rt,int len,const int *a,int lena,const int b,const int index)
/*计算保存在数组中的整数a与一个小于10的自然数b的乘积,结果保存到rt数组中,index表示b是整个乘法中乘数的第几位*/
{
int i;
int j;
for (i=len-index-1,j=lena-1; j>=0; --j,--i) {
rt[i]+=a[j]*b;
rt[i-1]+=rt[i]/10;
rt[i]%=10;
}
}
int *tran(const char *a)
{
int i,*rt,lena=strlen(a);
rt=malloc(sizeof(int)*lena);
for (i = 0; i<lena; i++) {
rt[i]=a[i]-48;
}
return rt;
}
int *mt(const char *a,const char *b,int *len)
/*返回两个大整数的积,两个大整数以字符串的型式保存在a和b数组中,返回保存相乘结果的整型数组地址,结果的长度由指针len带回*/
{
int i,j,lena=strlen(a),lenb=strlen(b),lenm;
int *ta,*tb,*tc,*mu;
lenm=lena<lenb?lena:lenb;
mu=malloc((lena+lenb)*sizeof(int));
if (lena>=lenb) {
ta=tran(a);
tb=tran(b);
}
else{
i=lena;
lena=lenb;
lenb=i;
ta=tran(b);
tb=tran(a);
}
tc=calloc(lena+lenb,sizeof(int)); /*tc数组保存最终的计算结果*/
for (i = 0; i<lenm; i++) { /*模拟笔算过程,保存每一位的乘积*/
memset(mu,0,(lena+lenb)*sizeof(int));
mst(mu,lena+lenb,ta,lena,tb[lenb-1-i],i);
for (j = lena+lenb-1; j>=0; j--) {/*将每一位的乘积相加,得到最终的结果*/
tc[j]+=mu[j];
if (j>0) tc[j-1]+=tc[j]/10;
tc[j]%=10;
}
}
free(ta);
free(tb);
free(mu);
*len=lena+lenb;
return tc;
}
int main(void)/*调用示例*/
{
char numa[]="123456789123456789",numb[]="9876543219876543210";
int len,*a;
a=mt(numa,numb,&len);/*计算numa和numb和乘积*/
prt(a,len);/*输出计算结果*/
free(a);
return 0;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
展开全部
#include<stdio.h>
int fun(int n)
{
int i , s = 1;
for(i=1;i<=n;i++)
s*=i;
return s;
}
#include<stdio.h>
long fun(int n)
{
int i;
long s=1;
for(i=1;i<=n;i++)
s*=i;
return s;
}
int main()
{
int i;
long d,sum =0;
for(i=1;i<=100;i++)
{
d=fun(i);
sum+=d;
}
printf("1!+2!+3!+4!+......+100!=%ld\n",sum);
return 0;
}
你要的这个数太大了,所以补码表示了。
如果真的要算出来,就要用字符串数组来实现,这样的程序比较繁琐,如果真的需要再问好了
int fun(int n)
{
int i , s = 1;
for(i=1;i<=n;i++)
s*=i;
return s;
}
#include<stdio.h>
long fun(int n)
{
int i;
long s=1;
for(i=1;i<=n;i++)
s*=i;
return s;
}
int main()
{
int i;
long d,sum =0;
for(i=1;i<=100;i++)
{
d=fun(i);
sum+=d;
}
printf("1!+2!+3!+4!+......+100!=%ld\n",sum);
return 0;
}
你要的这个数太大了,所以补码表示了。
如果真的要算出来,就要用字符串数组来实现,这样的程序比较繁琐,如果真的需要再问好了
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个题用正常的整数以及浮点数都是无法表示的,必须用数组。
#include<stdio.h>
#define Maxlen 10000
#define N 100
int mult(int num[],int len,int n)
{
int i,rem=0;
for(i=0;i<len;i++)
{
rem+=num[i]*n;
num[i]=rem%10;
rem=rem/10;
}
if(rem>0)
{
num[len]=rem%10;
len++;
rem=rem/10;
}
return len;
}
main()
{
int num[Maxlen];
int len=1,i;
num[0]=1;
for(i=2;i<=N;i++)
len=mult(num,len,i);
for(i=len-1;i>=0;i--)
printf("%d",num[i]);
printf("\n");
}
#include<stdio.h>
#define Maxlen 10000
#define N 100
int mult(int num[],int len,int n)
{
int i,rem=0;
for(i=0;i<len;i++)
{
rem+=num[i]*n;
num[i]=rem%10;
rem=rem/10;
}
if(rem>0)
{
num[len]=rem%10;
len++;
rem=rem/10;
}
return len;
}
main()
{
int num[Maxlen];
int len=1,i;
num[0]=1;
for(i=2;i<=N;i++)
len=mult(num,len,i);
for(i=len-1;i>=0;i--)
printf("%d",num[i]);
printf("\n");
}
参考资料: http://hi.baidu.com/networker05/blog/item/e70503241fe37831c8955999.html
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
c++算出结果出来了,你自己改成C吧
#include <iostream.h>
#include <math.h>
long double fac(int n){
if(n<=1)
return 1;
else
return n*fac(n-1);
}
void main(){
long double s=0;
for(int i=1;i<=100;i++)
s=s+fac(i);
cout<<s;
}
9.4269e+157
#include <iostream.h>
#include <math.h>
long double fac(int n){
if(n<=1)
return 1;
else
return n*fac(n-1);
}
void main(){
long double s=0;
for(int i=1;i<=100;i++)
s=s+fac(i);
cout<<s;
}
9.4269e+157
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include <stdio.h>
int main()
{
int i=0;
long temp=1;
long sum=0;
for(i=1;i<=100;i++)
{
temp*=i;
sum+=temp;
}
printf("sum=%ld\n",sum);
return 0;
}
int main()
{
int i=0;
long temp=1;
long sum=0;
for(i=1;i<=100;i++)
{
temp*=i;
sum+=temp;
}
printf("sum=%ld\n",sum);
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询