/*=====================================================
本程序求和1+2+……+100
再加1!+2!………+20!
再加1/1+1/2+……+1/10
精度(主要是指的第三部分,)和数据溢出(主要是第二部分)的问题必须被考虑,所以分三部分求解
====================================================*/
#include<limits>
#include<iostream>
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<maxN;i++)
{
tmp=source1[i]+source2[i]+carry;
source1[i]=static_cast<unsigned char>(tmp);
carry=static_cast<unsigned char>(tmp>>numeric_limits<unsigned char>::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<sizeof(unsigned int)/sizeof(unsigned char);i++)
{
tmp=source1[i]+static_cast<unsigned char>(source2)+carry;
source1[i]=static_cast<unsigned char>(tmp);
carry=static_cast<unsigned char>(tmp>>numeric_limits<unsigned char>::digits);
source2=static_cast<unsigned char>(source2>>numeric_limits<unsigned char>::digits);
}
if(carry==0)
{
return true;
}
else
{
for(;i<maxN&&carry!=0;i++)
{
tmp=source1[i]+carry;
source1[i]=static_cast<unsigned char>(tmp);
carry=static_cast<unsigned char>(tmp>>numeric_limits<unsigned char>::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<maxN;i++)
{
tmp=source2;
tmp*=source1[i];
tmp+=carry;
source1[i]=static_cast<unsigned char>(tmp);
carry=static_cast<unsigned char>(tmp>>numeric_limits<unsigned char>::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<maxN;i++)
{
sum2[i]=tmp2[i]=All.Interg[i]=0;
}
All.fraction=0;
//计算第一部分
for(i=1;i<=100;i++)
sum1+=i;
//计算第二部分
cout<<"\n请输入阶乘数:\nn=";
cin>>n;
if(n<=0)
{
cout<<"\n阶乘数n输入错误!程序默认使用n=20计算!!\n";
n=20;
}
else
;
tmp2[0]=1;
for(i=1;i<=n;i++)
{
if(mulMyArray(tmp2,static_cast<unsigned char>(i)))
{
if(addMyArray(sum2,tmp2))
;
else
{
cout<<"\n溢出!";
return 1;
}
}
else
{
cout<<"\n溢出!";
return 1;
}
}
//计算第三部分
tmp3=1;
for(i=1;i<=10;i++)
{
tmp3=1/static_cast<long double>(i);
sum3+=tmp3;
}
sum1+=static_cast<unsigned int>(sum3);
sum3-=static_cast<unsigned int>(sum3);
if(addArray(sum2,sum1))
{
if(addMyArray(All.Interg,sum2))
All.fraction=sum3;
else
{
cout<<"\n溢出!";
return 1;
}
}
else
{
cout<<"\n溢出!";
return 1;
}
cout<<"\n本程序计算1+2+……+100+1!+2!+……+"<<n<<"!+1/1+1/2+……+1/10\n整数部分是:"
<<hex
<<uppercase;
for(i=maxN-1;i>=0;i--)
{
sum1=All.Interg[i];
if(sum1!=0)
cout<<sum1;
else
continue;
}
cout<<"(十六进制)\n小数部分是";
cout<<All.fraction;
cout<<"(十进制)\n\n本程序成功运行!请输入一个数字退出……\n";
cin>>n;
return 0;
}
[此贴子已经被作者于2004-10-17 04:47:11编辑过]