大数相乘:
(思路参考某姜学长所得)
▶运用vector数组可用vector.size()方便快速求解;
▶模仿小学加减乘除的法则,发现两数相乘时位数为最终结果的相加位数;也是多亏数组是从0开始计数的,不然无法成立
例:
1 2
x 2 3
————————
3 6(6是第0位与第0位相乘之数,加在结果的第0 + 0 = 0位。3是0与1,则加1+0=0位)
+ 2 4(4是第1位与第0位相乘之数,则加在结果第1 + 0=1位)
_______________
= 276
题目描述
警告:距离开学还有8个小时~
小刺猬:什么,明天就要开学了,可是我数学作业还没有写,小灰,我需要你的帮助,不然要被老妈扣除零花钱了。
小灰:嗯?可是自己的作业要自己完成才对吧。
小刺猬:可是…我上课的时候没有认真听课。
小灰:明天我会给你带早餐过来的~加油啦,要靠自己。
看着作业本上满满的题目,小刺猬开始翻起了书。
输入
输入共一行,包含一个仅由数字和乘号组成的算术表达式。
表达式的运算结果为R(0 ≤ R ≤ 101000)。
输出
输出共一行,表示表达式的运算结果。
样例输入
1 * 2 * 3 * 4 * 5 * 6
样例输出
720
解题源码:
#include <iostream>
#include <string.h>
#include <vector>
#include <string>
using namespace std;
string xiangcheng(const string &a,const string &b)
{
vector<int> a1(a.size(),0);
vector<int> b1(b.size(),0);
vector<int> muti(a.size() + b.size(),0);
for(int k = a.size() - 1,h = 0;k >= 0;k--,h++)
a1[h] = a[k] - '0';
for(int k = b.size() - 1,h = 0;k >= 0;k--,h++)
b1[h] = b[k] - '0';
for(int k = 0;k < a1.size();k++)
{
for(int h = 0;h < b1.size();h++)
{
muti[h + k] += a1[k] * b1[h];//加在结果k + h位,注意结果数组为 += 而不是 = ;
}
}
for(int k = 0;k < muti.size();k++)
{
if(muti[k] >= 10)
{
muti[k + 1] += muti[k] / 10;//大于十进行进位
muti[k] %= 10;
}
}
int k = muti.size() - 1;
string tem = "";
for(;k >= 0 && !muti[k];k--);//判断相乘一共有多少位数;
if(k < 0)
return "0";//不要忘记0的存在
else
for(;k >= 0;k--)
tem += muti[k] + '0';
return tem;
}
int main()
{
string a, tem = "1";
while(getline(cin,a,'*'))
{
tem = xiangcheng(a,tem);
//cout << tem << endl;
}
cout << tem << endl;
}
大数相加:
类比小学相加,更为简单;
题目描述
高精度加法就是两个很大的、位数很多的数字相加。
输入
第一行有一个整数T,表示接下来有T组数据,对于每组,输入两行,每行表示一个非负整数(不超过200位)。
输出
T行数,每行一个数,是相应输入组的两数之和。
解题代码:
#include <iostream>
#include <algorithm>
#include <string.h>
#include <stdlib.h>
using namespace std;
#define m 1000001
int shuzi1[m], shuzi2[m], c[m];
int main()
{
int n;
cin >> n;
while(n--)
{
memset(shuzi1,0,sizeof(shuzi1));
memset(shuzi2,0,sizeof(shuzi2));
memset(c,0,sizeof(c));
string a, b;
int g = 0;
cin >> a >> b;
for(int k = a.length() - 1, j = 0;k >= 0;k--,j++)
{
shuzi1[j] = (int)(a[k] - '0');
}
for(int k = b.length() - 1, j = 0;k >= 0;k--,j++)
{
shuzi2[j] = (int)(b[k] - '0');
}
int h = max(a.size(),b.size());
for(int k = 0;k < h;k++)
{
c[k] = shuzi1[k] + shuzi2[k] + c[k];
if(c[k] >= 10)
{
g = 1;
c[k] = c[k] - 10;
c[k + 1] = c[ k + 1] + 1;
}
if(k == h -1 && g == 1)//判断是否相加为零;
{
h++;
break;
}
g = 0;
}
int i;
for (i = m - 1; (c[i] == 0) && (i >= 0); i--);
if (i >= 0) {
for (; i >= 0; i--)
cout << c[i];
cout << endl;
}
else cout << '0' << endl;
}
}