您的位置:首页 > 其它

大数加法乘法

2017-09-09 00:01 211 查看
字符串是一个简单、有效的表示大数的方法

用一个char型字符表示十进制数字的一位

模拟手工加法:

/*大数加法*/
const int N = 1e5 + 10;//100010
string str1,str2;
int res
;//保存结果

void BigIntAdd(string str1,string str2)
{
int len1 = str1.size();
int len2 = str2.size();
int Takeover = 0;//进位标志
len1--;len2--;
int k = 0;
int tmp;//临时计算值
while(len1 >= 0 && len2 >= 0)
{
tmp = str1[len1] - '0' + str2[len2] - '0' + Takeover;
if(tmp >= 10)
{
Takeover = 1;
tmp %= 10;//tmp -= 10
}
else
{
Takeover = 0;
}
res[k++] = tmp;
len1--;
len2--;
}
while(len1 >= 0)
{
tmp = str1[len1] - '0' + Takeover;
if(tmp >= 10)
{
Takeover = 1;
tmp %= 10;
}
else
{
Takeover = 0;
}
res[k++] = tmp;
len1--;
}
while(len2 >= 0)
{
tmp = str2[len2] - '0' + Takeover;
if(tmp >= 10)
{
Takeover = 1;
tmp %= 10;
}
else
{
Takeover = 0;
}
res[k++] = tmp;
len2--;
}
//检测进位标志
if(Takeover > 0)
{
res[k] = Takeover;
}
//打印
int len = str1.size() + str2.size();
len--;
while(len && res[len] == 0)//去掉输出结果前面的0
{
len--;
}
while(len >= 0)
{
cout<<res[len];
len--;
}
cout<<endl;
}

void main()
{
str1 = "99";
str2 = "1";
BigIntAdd(str1,str2);
}


模拟手工乘法:

/*大数乘法*/
const int N = 1e5 + 10;//100010
string str1,str2;
int a
,b
,res
;//保存结果

void BigIntMul(int *a,int *b,int la,int lb)
{
int i,j;
//逐位相乘
for(int i = 0;i < la;i++)
{
for(int j = 0;j < lb;j++)
{
int k = i+j;
res[k] += a[i] * b[j];
while(res[k] > 9)
{
res[k+1] += res[k] / 10;
res[k] %= 10;
k++;
}
}
}
int len = la + lb;
len--;
while(len && res[len] == 0) len--;
//逆序打印结果
while(len >= 0)
{
cout<<res[len];
len--;
}
cout<<endl;
}
void main()
{
cout<<N<<endl;
str1 = "200";
str2 = "3";
int la = str1.size(),lb = str2.size();
//将字符串元素(从后往前)放入整形数组
for(int i=0;i<la;i++)
{
a[i] = (int)(str1[la-i-1] - '0');
}
for(int i=0;i<lb;i++)
{
b[i] = (int)(str2[lb-i-1]-'0');
}
BigIntMul(a,b,la,lb);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: