/*=====================================================
本程序求和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编辑过]