老是写这些又臭又长的代码
不知道各位大佬的代码都是从哪里参考的
算法1
又臭又长版
#include <iostream>
#include <string>
using namespace std;
const int N = 100010;
int f[N] = {0};
void multiplying(const string& a, const string& b)
{
int left = 0, temp = 0;
int pivot = 0;
for(int bi = b.size() - 1;bi>=0;--bi)
{
if(b[bi] == '0')
continue;
left = 0;
pivot = b.size() - 1 - bi;
int bVal = b[bi] - '0';
for(int i = a.size() - 1;i>=0;--i)
{
temp = f[pivot] + (a[i] - '0')*bVal + left;
left = temp/10;
f[pivot++] = temp%10;
}
if(left > 0)
f[pivot++] = left;
}
while(pivot>0)
{
std::cout<<f[--pivot];
}
}
int main()
{
string a, b;
std::cin>>a>>b;
//std::cout<<a<<std::endl<<b<<std::endl;
multiplying(a,b);
return 0;
}
算法2
看了一下其他人的代码,发现一个好用的地方
输入的第二个数据 10*b 的范围是在整形之内的,因此可以借助这个特点,直接计算a的每一位与b相乘的结果,而不需要a的每一位与b的每一位相乘计算。
简洁太多了啊。
C++ 代码
void multiplying(const string& a, const int& b)
{
int left = 0;
int pivot = 0, ai = a.size();
while(ai > 0 || left > 0)
{
if(ai>0)
{
left = left + (a[--ai]-'0')*b;
}
f[pivot++] = left%10;
left = left/10;
}
while(pivot>0)
{
std::cout<<f[--pivot];
}
}
老哥相信我,用结构体重载运算符之后代码会好写很多,而且我认为很优美
老哥秀啊,我去试试