您的位置:首页 > 其它

高精度乘法,输入任意位的正整数,计算其结果,并显示计算过程(乘法竖式)

2008-10-19 10:09 316 查看
/* Kingsoft
高精度乘法,输入任意位的正整数,计算其结果,并显示计算过程(乘法竖式),写出算法思路、函数实现
比如×=,应显示为:
11
×11
——————
11
11
——————
121
*/
#include <iostream>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <iomanip>
using namespace std;

vector<int> addVector(vector<int> &v1, vector<int> &v2) // v2加到v1上,需调整进位
{
vector<int> temp;
vector<int>::reverse_iterator rit1 = v1.rbegin();
vector<int>::reverse_iterator rit2 = v2.rbegin();
int x;
int carry = 0;
if( v1.size() >= v2.size() )
{
for( ; rit2!=v2.rend(); rit1++, rit2++)
{
x = *rit1 + *rit2 + carry;
carry = 0;
if( x>=10 )
{
carry = 1;
x -= 10;
}
temp.push_back(x);
}
for( ; rit1!=v1.rend(); rit1++)
{
x = *rit1 + carry;
carry = 0;
if( x>=10 )
{
carry = x/10;
x %= 10;
}
temp.push_back(x);
}
if(carry)
{
temp.push_back(carry);
}
reverse(temp.begin(), temp.end());
return temp;
}
else
{
return addVector(v2, v1);
}
}

void showMultiply(const char *a, const char *b)
{
int m = strlen(a);
int n = strlen(b);
int n_bak = n;

vector<int> vi;
vector<int> result;
int x, y , z;
int carry = 0;

// 对齐显示乘数和被乘数
cout << setw(m+n) << a << endl;
cout << setw(m) << "×" << b << endl;
for(int i=0; i<(m+n); i++) // 显示“-------”
cout << "-";
cout << endl;

while(n) // 按乘数逐位计算
{
if( b[n-1]<='0' || b[n-1]>='9')
{
cout << "error input" << endl;
return;
}
x = b[n-1] - '0';
for(int i=m-1; i>=0; i--) // 第n位乘数与被乘数相乘
{
if( a[i]<='0' || a[i]>='9')
{
cout << "error input" << endl;
return;
}
y = a[i] - '0';
z = x * y + carry;
carry = 0;
if( z>=10 )
{
carry = z/10;
z %= 10;
}
vi.push_back(z);
}
if(carry)
{
vi.push_back(carry);
}

reverse(vi.begin(), vi.end()); // 计算是由地位向高位的,显示时需要翻转

vector<int>::iterator it = vi.begin();
cout << setw(m+n-vi.size());
for( ; it!=vi.end(); it++) // 显示第n步计算步骤
{
cout << *it;
}
cout << endl;

for(int i=0; i<(n_bak-n); i++) // 末尾加,相当于上次的结果*10
{
vi.push_back(0);
}

result = addVector(result, vi); // 部分和相加


vi.clear();
n--;
}

for(int i=0; i<(m+n_bak); i++) // 显示“-------”
cout << "-";
cout << endl;
vector<int>::iterator it = result.begin();
for( ; it!=result.end(); it++) // 显示结果
{
cout << *it;
}
cout << endl << endl;
}

void showMultiply(int x, int y)
{
char a[15], b[15];
sprintf(a, "%d", x);
sprintf(b, "%d", y);
showMultiply(a, b);
}

int main(void)
{
showMultiply(4567, 65);
showMultiply("12343453443624567252345351", "123412");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐