大数的乘法

题目描述

大数是指计算的数值非常大或者对运算的精度要求非常高,用已知的数据类型无法精确表示的数值。例如:我们要计算如下两个数的乘积时,用我们已知的数据类型是无法精确表示其结果的:

a1 = 11111111111111111111111111111111111

b1 = 11111111111111111111111111111111111111

求:a1 * b1;

输入要求

输入两行:每行一个数字,每行的数字不超过100位;

输出要求

输出一行:为这两个大数的乘积

假如输入

1111111111111111111
111111111111111

应当输出

123456790123456666654320987654321

#include<iostream>
#include<algorithm>
#include <vector>
#include<string.h>
#include<ctype.h>
#include<math.h>
using namespace std;
void fun();
int main()
{
    fun();
    return 0;
}
void fun()
{
	int len1,len2,i,start,j,k,ans[201];
	char str1[100],str2[100];
	gets(str1);
	gets(str2);
	len1=strlen(str1);
	len2=strlen(str2);
	if(str1[0]=='0'||str2[0]=='0')
		cout<<0<<endl;
	else
	{
		memset(ans,0,sizeof(ans));
		for(i=len1-1,k=0;i>=0;i--,k++)
		{
			for(j=len2-1,start=k;j>=0;j--)
			{
				ans[start++]+=(str1[i]-'0')*(str2[j]-'0');
			}
		}
		for(i=0;i<200;i++)
		{
			if(ans[i]>9)
			{
				ans[i+1]+=ans[i]/10;
				ans[i]%=10;
			}
		}
		for(i=200;i>=0;i--)
			if(ans[i]!=0)
				break;
		for(;i>=0;i--)
			cout<<ans[i];
		cout<<endl;
	}
}

完完整整一步一步分析自己写出来的,加油!

时间: 2024-10-25 04:43:27

大数的乘法的相关文章

LeetCode-Multiply Strings实现大数的乘法

Given two numbers represented as strings, return multiplication of the numbers as a string. Note: The numbers can be arbitrarily large and are non-negative. 题目当中主要是需要两个大数的乘法,一般大数都是用字符串进行保存 代码比较简单,主要是利用了一个vector反向的存储了计算的结果,然后reverse到string当中进行输出 这里当然可

大数加法乘法

大数加法乘法: 1 /* 2 2015.4 3 大数加法,乘法 4 5 */ 6 #include <iostream> 7 #include <string> 8 #include <vector> 9 10 using namespace std; 11 #define MAX 99 12 #define MAXM 200 13 14 void BigNumAdd() 15 { 16 char strA[MAX], strB[MAX]; 17 cout <&l

【字符串】大数的乘法(包括浮点数)

一.大数乘法 我们知道,要运算两个数的乘法,c.c++语言里有专门的运算符*.但是当两个数超过一定的范围时,用普通的运算符会产生溢出,并不能得到正确的结果.如何进行运算呢?       首先,要想保存一个大数,用正常的整形或浮点类型是不够的.所以我们可以采用字符串的形式对大数进行保存,然后编写算法,模拟乘法运算过程即可. 1.第一个问题:两个数字运算结果至多用多少位的字符串保存呢? 两个4位数相乘,最大值为9999*9999它的位数小于10000*10000的位数9位,所以两个数字相乘的结果至多

vector、string实现大数加法乘法

理解 vector 是一个容器,是一个数据集,里边装了很多个元素.与数组最大的不同是 vector 可以动态增长. 用 vector 实现大数运算的关键是,以 string 的方式读入一个大数,然后将字串的每一个字符 s[i] 以 int 形式赋给 vector<int> a 中的每一个元素.然后将 a[i] 和 a[j] 加起来(或者乘起来).每两个元素加起来的结果 <= 18,乘起来的结果 <= 81. 用 string 实现大数加法的方法跟 vector 差不多,但是用 st

关于大数的乘法(2的128次方)

用JDK自带的方法: 1 import java.math.BigDecimal; 2 3 public class Test 4 { 5 public static void main(String[] args)throws Exception 6 { 7 BigDecimal two = new BigDecimal("2"); 8 BigDecimal two_128 = new BigDecimal(two.pow(128).toString()); 9 10 System.

大数的乘法(C++)

题目:POJ 2398 Bull Math Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13410   Accepted: 6903 Description Bulls are so much better at math than the cows. They can multiply huge integers together and get perfectly precise answers ... or so

[acm 1001] c++ 大数加法 乘法 幂

北大的ACM 1001 poj.org/problem?id=1001 代码纯手动编写 - - 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 5 6 class BigNumber 7 { 8 struct BigNumberNode 9 { 10 BigNumberNode():n(0), prev(NULL), next(NULL){} 11 BigNumberNode(int N)

ACM学习历程—51NOD1028 大数乘法V2(FFT)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1028 题目大意就是求两个大数的乘法. 但是用普通的大数乘法,这个长度的大数肯定不行. 大数可以表示点值表示法,然后卷积乘法就能用FFT加速运算了. 这道题是来存模板的. 代码: #include <iostream> #include <cstdio> #include <cstdlib> #include <cmath>

剑指offer编程题Java实现——面试题12相关题大数的加法、减法、乘法问题的实现

用字符串或者数组表示大数是一种很简单有效的表示方式.在打印1到最大的n为数的问题上采用的是使用数组表示大数的方式.在相关题实现任意两个整数的加法.减法.乘法的实现中,采用字符串对大数进行表示,不过在具体的计算中,还是要将字符串转化成字符数组来进行计算. 实现两个大数的加法,要考虑到两个问题,两个数的和的位数问题,以及如何处理两个数按位相加产生的进位问题.首先两个整数相加,两个数的和的位数最多比最大的整数的位数多1:这样和的位数就确定了.对于进位问题,我的做法是先进行按位相加,相加操作完成后再按照