c语言1 10之和,[推荐]绝对1~100的和+1!~20!之和+1/1~1/10之和的完整解法

/*=====================================================

本程序求和1+2+……+100

再加1!+2!………+20!

再加1/1+1/2+……+1/10

精度(主要是指的第三部分,)和数据溢出(主要是第二部分)的问题必须被考虑,所以分三部分求解

====================================================*/

#include

#include

using namespace std;

/***********************************************************

下面是我定义的函数用于计算的(用于解决计算时丢失数据精度的问题)

在其中存储的都是——》十六《——进制数

***********************************************************/

const maxN=10;//如果要计算更大的数请更改

bool addMyArray(unsigned char source1[maxN],unsigned char source2[maxN])//source1+source2->source1

{

unsigned int i=0;

unsigned int tmp=0;

unsigned char carry=0;

for(i=0;i

{

tmp=source1[i]+source2[i]+carry;

source1[i]=static_cast(tmp);

carry=static_cast(tmp>>numeric_limits::digits);

}

if(carry==0)

{

return true;

}

else

{

return false;

}

}

bool addArray(unsigned char source1[maxN],unsigned int source2)//source1+source2->source1

{

unsigned int i=0;

unsigned int tmp=0;

unsigned char carry=0;

for(i=0;i

{

tmp=source1[i]+static_cast(source2)+carry;

source1[i]=static_cast(tmp);

carry=static_cast(tmp>>numeric_limits::digits);

source2=static_cast(source2>>numeric_limits::digits);

}

if(carry==0)

{

return true;

}

else

{

for(;i

{

tmp=source1[i]+carry;

source1[i]=static_cast(tmp);

carry=static_cast(tmp>>numeric_limits::digits);

}

if(carry==0)

return false;

else

;

}

return true;

}

//source1*source2->source1

bool mulMyArray(unsigned char source1[maxN],unsigned char source2)

{

unsigned int i=0;

unsigned int tmp=0,tmpC=0;

unsigned char carry=0,carry1=0;

for(i=0;i

{

tmp=source2;

tmp*=source1[i];

tmp+=carry;

source1[i]=static_cast(tmp);

carry=static_cast(tmp>>numeric_limits::digits);

}

if(carry==0)

{

return true;

}

else

{

return false;

}

}

/*************************************************************************

上面是我自定义的函数用于计算的

***********************************************************************/

int main(void)

{

//定义变量

int i=0,j=0,n=20;

//计算第一部分的定义

unsigned int sum1=0;

//计算第二部分的定义

unsigned char sum2[maxN],tmp2[maxN];

//计算第三部分的定义

long double sum3=0,tmp3=0;

//计算所有部分的和的变量定义

struct sumAll

{

unsigned char Interg[maxN];

long double fraction;

}All;

for(i=0;i

{

sum2[i]=tmp2[i]=All.Interg[i]=0;

}

All.fraction=0;

//计算第一部分

for(i=1;i<=100;i++)

sum1+=i;

//计算第二部分

cout<

cin>>n;

if(n<=0)

{

cout<

n=20;

}

else

;

tmp2[0]=1;

for(i=1;i<=n;i++)

{

if(mulMyArray(tmp2,static_cast(i)))

{

if(addMyArray(sum2,tmp2))

;

else

{

cout<

return 1;

}

}

else

{

cout<

return 1;

}

}

//计算第三部分

tmp3=1;

for(i=1;i<=10;i++)

{

tmp3=1/static_cast(i);

sum3+=tmp3;

}

sum1+=static_cast(sum3);

sum3-=static_cast(sum3);

if(addArray(sum2,sum1))

{

if(addMyArray(All.Interg,sum2))

All.fraction=sum3;

else

{

cout<

return 1;

}

}

else

{

cout<

return 1;

}

cout<

<

<

for(i=maxN-1;i>=0;i--)

{

sum1=All.Interg[i];

if(sum1!=0)

cout<

else

continue;

}

cout<

cout<

cout<

cin>>n;

return 0;

}

[此贴子已经被作者于2004-10-17 04:47:11编辑过]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值