C++实现大数相乘

大意:用string 类型的两个大数进行相乘,输出结果

输入:样例一:-11  -11

   样例二:-15116516166564654646456456454655  121231312313214984894961116

输出:样例一:121

   样例二:-1832595092476562998391796185384824031048718264583442194980

思路:纯粹地模拟手动计算两个数相乘的过程即:

  1. 判断是否带负号,带负号则取出数值部分
  2. 以一个字符串的每一位去乘另一个字符串的每一,并用一个字符串保存结果
  3. 补齐第二步中得到字符串的低位,补充相应个数个0
  4. 将第三步中得到所有字符串进行相加
  5. 输出负号及第四步中得到的数值结果
#include <iostream>
#include <string>
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 < s2.size(); i++)					//对中间结果补齐位数
	{
		for(j = i;j > 0; j--)
		{
			result_one[i] = result_one[i] + ‘0‘;
		}
	}

	string sum = "0";								//用sum变量保存最终结果 

	for(i = 0;i < s2.size(); i++)
	{
		sum = count_add(sum,result_one[i]);			//相加
	}

	int tip = 0;

	for(i = 0; i < sum.size(); i++)					//找出非零的起始位置
	{
		if(sum[i] == ‘0‘ )
		{
			tip ++;
		}
		else
			break;
	}	

	if(nega_s1 + nega_s2 == 1)						//输出符号
		cout<<"-";

	for(i = tip ; i < sum.size(); i++)				//输出数字部分答案
	{
		cout<<sum[i];
	}

	if(tip == sum.size())
		cout<<"0";

	return 0;
}

  补充:输出进行了一定处理,防止输出0001这样的结果(即不输出数字开始的0)

  运行截图如下

  再试试真正的大数相乘

  

原文地址:https://www.cnblogs.com/z1223/p/9637995.html

时间: 2024-10-11 22:50:46

C++实现大数相乘的相关文章

1051:A &#215; B problem 大数相乘

给你两个整数,请你计算A × B. 输入 数据的第一行是整数T(1 ≤ T ≤ 20),代表测试数据的组数.接着有T组数据,每组数据只有一行,包括两个非负整数A和B.但A和B非常大,Redraiment能保证这些数用long来保存一定会溢出.但A和B的位数最大不会超过100位. 输出 对应每组测试数据,你都要输出两行:第一行为:"Case #:", # 代表这是第几组测试数据.第二行是一个等式:"A * B = Sum", Sum 代表 A × B 的结果.你要注意

大数相乘

1.算法思路 将大数当做字符串进行处理,也就是将大数用十进制字符数组进行表示,然后模拟人们手工进行“竖式计算”的过程得到乘法的结果. 乘积是逐位相乘,也就是a[i] * b[j],结果加入到积C的第i+j位,即 最后处理进位即可 例如:A =17 = 1*10 + 7 = (7,1)最后是十进制的幂表示法,幂次是从低位到高位,以下同. B=25 = 2*10 + 5 = (5, 2); C = A * B = (7 * 5, 1 * 5 + 2 * 7, 1 * 2) = (35, 19, 2)

两大数相乘 -- javascript 实现

(function(){ var multiply = function(n1,n2){ var nstr1 = n1.toString(); var nstr2 = n2.toString(); var carry = 0; var ret = ""; var di = 0; var dj = 0; var dig = 0.1; for(var i = nstr1.length - 1 ;i >= 0;i--) { var tmp = ""; var di

ACM大赛题 【C++大数相乘】

题     目: 大数相乘,我们常常会遇见几百位长的数字之间相乘的编程题,例如在算法中,ACM大赛题中,下面就是大数相乘的详细过程. 思      路: 模拟相乘法 举例说明: 123*789=97047 原理展示: 计算机计算: . C++源代码: 结果展示:

java版大数相乘

在搞ACM的时候遇到大数相乘的问题,在网上找了一下,看到了一个c++版本的 http://blog.csdn.net/jianzhibeihang/article/details/4948267 用java搞了一个版本 这里说一下思路 将数字已字符串形式接收,转换成int[]整型数组,然后num1[],num2[]依次相乘,结果保存到result[]中 其他注意的在注释中有说明 1 package com.gxf.test; 2 3 import java.util.Scanner; 4 5 p

UVA 10106 Product (大数相乘)

Product The Problem The problem is to multiply two integers X, Y. (0<=X,Y<10250) The Input The input will consist of a set of pairs of lines. Each line in pair contains one multiplyer. The Output For each input pair of lines the output line should c

大数相乘&mdash;&mdash;模拟乘法的运算规则

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> int main() { void add(int a[], int length1, int b[], int length2); char str1[255], str2[255]; int num1[255] = { 0 }, num2[255] = { 0 }; int product[255] = { 0 }, temp[255] =

海豚实习-实现两个大数相乘

问题描述:定义大数d为一个数组,表示为:d=a[k-1]*10^(k-1)+a[k-2]*10^(k-2)+...+a[1]*10+a[0](k为数组长度),实现一个函数,返回两个大数相乘的结果 /** d1=a[k-1]*10^(k-1)+a[k-2]*10^(k-2)+...+a[1]*10+a[0] d2=b[l-1]*10^(l-1)+b[l-2]*10^(l-2)+...+b[1]*10+b[0] d1*d2 包含k*l项,这只是没有合并的 每一项可以表示为:d*10^x,然后将(x,

求解Catalan数,(大数相乘,大数相除,大数相加)

Catalan数 卡塔兰数是组合数学中一个常在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰(1814–1894)命名.历史上,清代数学家明安图(1692年-1763年)在其<割圜密率捷法>最早用到"卡塔兰数",远远早于卡塔兰.有中国学者建议将此数命名为"明安图数"或"明安图-卡塔兰数".卡塔兰数的一般公式为 C(2n,n)/(n+1). 性质: 令h(0)=1,h(1)=1,卡塔兰数满足递归式: h(n)= h(0)*

大数相乘、相加、相减、相除

实现大数的加.减.乘.除运算 1 package com.bignumber.test; 2 3 /** 4 * 大数运算(+.-.*./) 5 * @author chen 6 * 7 */ 8 public class BigNumber { 9 10 public static void main(String[] args) { 11 12 String str1 = "123456789";//大数一 13 String str2 = "9876543210&quo