C语言编程:计算s=1+(1×3)+(1×3×5)+(1×3×5×7)+(1×3×5×7×9)+……前20项的和。
3个回答
展开全部
设求n项之和,则每一项都是1~2n-1的连续奇数之积。用一临时变量t记录第n项的值,则第n+1项的值就是t(2(n+1)-1)=t(2n+1)。根据这一思路编程,既可以简化代码,又可以提高执行时效(将求1~2n-1的奇数积过程减缩为求一次乘法)。由于1×3×5×...x39就是个很大的数,__int64、long long这些类型的变量都不能承载了,况且还要求20项之和。所以得用大数处理办法来解决。代码如下:
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#define N 20
int main(int argc,char *argv[]){
int n,t,i,*ps,*pt;
double x;
for(x=0,n=N<<1,t=3;t<n;x+=log10(t),t+=2);
n=int(x)+!!(x-int(x));//求运算结果的十进制数的最大位数
n=n/7+!!(n%7);//求每元素承载7位十进制数时的数组大小
if(!(ps=(int *)malloc(4*n)) || !(pt=(int *)malloc(4*n))){//动态申请内存
printf("Application memory failure...\n");//申请失败则退出
return 0;
}
for(t=0;t<n;ps[t++]=pt[t]=0);//数组清0
for(pt[n-1]=t=1;t<=N;t++){//以下大数操作
for(i=n-1;i>=0;pt[i--]*=(t<<1)-1);//将pt各元素乘以2t-1完成阶乘操作
for(i=n-1;i>0;i--)//处理阶乘进位
if(pt[i]>9999999)
pt[i-1]+=pt[i]/10000000,pt[i]%=10000000;
for(i=n-1;i>0;i--)//求和
if((ps[i]+=pt[i])>9999999)//处理和进位
ps[i-1]+=ps[i]/10000000,ps[i]%=10000000;
ps[0]+=pt[0];
}
free(pt);
printf("The result is: %d",ps[0]);//首元素数字不要前导0
for(i=1;i<n;printf("%07d",ps[i++]));//后续元素必须输出前导0
free(ps);
printf("\n");
return 0;
}
运行结果如下:
以上代码中,pt充当文字说明中的t角色,ps充当和记录变量s角色。代码应运行在32位int平台下。
展开全部
#include <stdio.h>
void main()
{long s=0,n=1;
int i;
for(i=1; i<=39 ; i+=2)
{
n*=i;
s+=n;
}
printf("\ns=%ld",s);
}
void main()
{long s=0,n=1;
int i;
for(i=1; i<=39 ; i+=2)
{
n*=i;
s+=n;
}
printf("\ns=%ld",s);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int main(){
int i,j,sum=0,part;
for(i=1;i<=20;i++){
part=1;
for(j=1;j<i;j++){
part=part*(2*j+1);
}
sum=sum+part;
}
printf("%d",sum);
getch();
return 0;
}
int i,j,sum=0,part;
for(i=1;i<=20;i++){
part=1;
for(j=1;j<i;j++){
part=part*(2*j+1);
}
sum=sum+part;
}
printf("%d",sum);
getch();
return 0;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询