C++实现大数相乘
标签:unit 字符串 std names 需要 ace 图片 一个 space
大意:用string 类型的两个大数进行相乘,输出结果
输入:样例一:-11 -11
样例二:-15116516166564654646456456454655 121231312313214984894961116
输出:样例一:121
样例二:-1832595092476562998391796185384824031048718264583442194980
思路:纯粹地模拟手动计算两个数相乘的过程即:
- 判断是否带负号,带负号则取出数值部分
- 以一个字符串的每一位去乘另一个字符串的每一,并用一个字符串保存结果
- 补齐第二步中得到字符串的低位,补充相应个数个0
- 将第三步中得到所有字符串进行相加
- 输出负号及第四步中得到的数值结果
#include
#include
using namespace std;
string max_i,min_i;
string count_add(string s1,string s2) //进行两个数相加
{
max_i = s1;min_i = s2;
if(s2.size()>s1.size())
{
max_i = s2; //取长度大的数为max
min_i = s1;
}
for(int i = min_i.size()-1,j = max_i.size()-1; i>=0;i--,j--) //模拟整数加的过程
{
max_i[j] += min_i[i] -‘0‘; //选择将结果保存在max变量中
if(max_i[j] > ‘9‘) //字符值大于9需要处理
{
if(j > 0)
{
max_i[j - 1] ++;
max_i[j] -= 10;
}
else
{
max_i = "1" + max_i;
max_i[j] -= 10;
}
}
}
return max_i;
}
int main()
{
string s1,s2;
cin>>s1>>s2;
int i,j;
bool nega_s1 = false,nega_s2 = false;
if(s1[0] == ‘-‘) //若带负号,则取出数字部分
{
nega_s1 = true;
s1 = s1.substr(1); //将第一位开始的部分重新赋给s
}
if(s2[0] == ‘-‘)
{
nega_s2 = true;
s2 = s2.substr(1);
}
char unit, decade = ‘0‘;
int a,b;
string result_one[s2.size()]; //保存中间的s2的每一位乘s1的结果
for(i = s2.size()-1; i >= 0; i--) //模拟相乘过程
{
a = s2[i] - ‘0‘;
for(j = s1.size()-1; j >= 0; j--)
{
b = s1[j] - ‘0‘;
unit =((a * b) + decade - ‘0‘) % 10 + ‘0‘ ; //保存两个数字相乘的个位、十位
decade = ((a * b) + decade - ‘0‘) / 10 + ‘0‘;
result_one[s2.size() -1- i] = unit + result_one[s2.size() -1- i] ;
}
if(decade != ‘0‘)
result_one[s2.size() -1- i] = decade + result_one[s2.size() -1- i];
decade = ‘0‘;
}
for(i = 0; i 0; j--)
{
result_one[i] = result_one[i] + ‘0‘;
}
}
string sum = "0"; //用sum变量保存最终结果
for(i = 0;i
补充:输出进行了一定处理,防止输出0001这样的结果(即不输出数字开始的0)
运行截图如下
再试试真正的大数相乘
C++实现大数相乘
标签:unit 字符串 std names 需要 ace 图片 一个 space
原文地址:https://www.cnblogs.com/z1223/p/9637995.html
评论