高精度乘法,输入任意位的正整数,计算其结果,并显示计算过程(乘法竖式)
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;
}
高精度乘法,输入任意位的正整数,计算其结果,并显示计算过程(乘法竖式),写出算法思路、函数实现
比如×=,应显示为:
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;
}
相关文章推荐
- 用python写高精度的数据乘法,要求输入的书不大于256的正整数,计算其结果
- Python模拟大整数乘法的小学竖式计算过程
- 编写一个程序,要求用户输入下限整数和一个上限整数,然后,依次计算从下限到上限的每一个整数的平方的加和,最后显示结果
- 给出两个整数a和b,请计算他们的和a + b,比如输入1和2,计算出结果为3。
- 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 从键盘上任意输入一个3位整数,编译计算并输出它的逆序数(忽略整数前的正负号)
- 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 关于大整数的乘法的算法时间复杂度的计算过程推导(纯属个人推测,请高人指正)
- 编写猜字游戏,随机产生一个1-1000的整数,玩家任意输入一个数字,计算器回答大于该数或者小于该数,直至猜中。(显示玩家猜的次数)
- 第五周项目一(3)输入任意整数N,当N小于零时显示“low”,否则显示“hight”
- java 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 用函数编程计算两整数的最大值,在主函数中调用该函数计算并输出从键盘任意输入的两整数的最大值。
- 输入任意两个整数数字,计算这两个数字间能被3整除的数的和
- 输入两个整数a和b,及另一正整数c,计算a/b,结果精确到小数点后c位
- 帮忙看看:任意输入几个整数,然后计算其个数。
- js:制作一个简易的计数器:根据输入的两个整数和运算符,进行计算,然后输出计算结果
- Java:多重循环for、while、do-while(简单判断是否是四位整数、1-100累加,水仙花、最大公约数。最小公倍数、完数、输入任意数计算每位数之和、弹力球问题)
- 《剑指Offer》输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 输入两个整数m和n,及另一个整数k,计算m/n,结果精确到小数点后k位。
- 计算任意一个输入的正整数数字的各位数字之和