大数问题
大数是指计算的数值非常大或者对运算的精度要求非常高,用已知的数据类型无法精确表示的数值。
例如求Fibonacci数列的第1000个数。
例计算 到小数点后第2000位。
计算大数的一般方法是用数组模拟大数的运算,开一个比较大的整型(或双精度类型)数组,数组的元素代表大数的某一位,通过数组元素的运算模拟大数的运算,最后将代表大数的数组输出。
常用的大数算法有如下几种类型:
大数的加减;
大数的乘;
超大数的乘积;
任意高精度计算。
整数探究
输入:
输入最多100行,每行一个超长整数。
每个整数最多100位。
没有负数输入。
最后输入0结束。
输出:
输出所有输入超长整数的和。
输入样例:
123456789012345678901234567890
123456789012345678901234567890
123456789012345678901234567890
0
输出样例:
370370367037037036703703703670
程序代码:
#include
#include
#include
#include
using namespace std;
void main()
{
ifstream stream("input.txt");
vector
int f=1,g=0;
char str[100];
memset(str,0,sizeof(str));
stream>>str;
while(!stream.eof())
{
if(str!="0")
{
if(f==1)
{
for(int i=0;i<100;i++)
{
if(str[i]!='/0')
{
char c=str[i];
int b=atoi(&c);
v1.push_back(b);f=2;
}
else{ break; }
}
g++;
}
else
{
for(int i=0;i<100;i++)
{
if(str[i]!='/0')
{
char c=str[i];
int b=atoi(&c);
v2.push_back(b);
}
else{ break; }
}
g++;
}
if(g==1)
{
memset(str,0,sizeof(str));
stream>>str;continue;
}
else
{
int smallsize,bigsize;
if(v1.size()>=v2.size())
{
smallsize=v2.size()-1;
bigsize=v1.size()-1;
int middle=0,i=bigsize;
for(i;i>=0;i--)
{
// cout<
if(smallsize>=0)
{
middle=(v1[i]+v2[smallsize]+middle)/10;
v1[i]=(v1[i]+v2[smallsize]+temp)%10;
// cout<
}
else
{
middle=(v1[i]+middle)/10;
if(middle==0){ v1[i]+=temp;break;}
else{ v1[i]=(v1[i]+temp)%10; }
}
}
if(i<0&&middle==1){ v1.insert(v1.begin(),1); }
f=2;
/* for(int d=0;d
}
else
{
smallsize=v1.size()-1;
bigsize=v2.size()-1;
int middle=0,i=bigsize;
for(i;i>=0;i--)
{
int temp=middle;
//cout<
{
middle=(v2[i]+v1[smallsize]+middle)/10;
v2[i]=(v2[i]+v1[smallsize]+temp)%10;
// cout<
}
else
{
middle=(v2[i]+middle)/10;
if(middle==0){ v2[i]+=temp;break;}
else{ v2[i]=(v2[i]+temp)%10; }
}
}
if(i<0&&middle==1)
{
v2.insert(v2.begin(),1);
}
f=1;
/*for(int d=0;d
}
}
memset(str,0,sizeof(str));
stream>>str;
}//if str
else{ break;}
}//while
if(g==0){ cout<<"0"<
{
if(f==1)
{
for(int j=0;j
cout<
cout<
else
{
for(int j=0;j
cout<
cout<
}//else g
}