大数减法、加法、乘法

原创 2014年09月14日 16:51:13
#include<iostream>
#include<string>
using std::string;
using std::cin;
using std::cout;
using std::endl;

//字符转换为字面数字
int CharToInt(char value){
	return value-'0';
}
 

//打印结果函数
void print(int* array,int length ){  
	int index=length-1;
	for(int i=length-1;i>=0;--i){ 
		//当遇到第一个不为0的数字
		if(array[i]!=0 || i==0){
			index=i;
			break;
		}
	}
	for(int j=index;j>=0;--j){
		cout<<array[j];
	}
	cout<<endl;
}

//加法函数
void add(int* arr1,int length1,int* arr2,int length2){ 
	for(int i=0;i<(length1>length2?length1:length2);++i){
		if(arr1[i]+arr2[i]>=10){
			arr1[i]=(arr1[i]+arr2[i])%10;
			//进位
			++arr1[i+1];
		}
		else{
			arr1[i]=arr1[i]+arr2[i];
		}
	}
}

//减法,确保减数比被减数大
void sub(int* arr1,int length1,int* arr2,int length2){
	int index1=length1-1,index2=length2-1;
	while(index2>=0){
		//如果该位数字不用借位 
		if(arr1[index1] >= arr2[index2]){
			arr1[index1]-=arr2[index2];
		}
		else{
			arr1[index1]=arr1[index1]+10-arr2[index2];
			arr1[index1-1]-=1;
		} 
		--index1;
		--index2;
	}
	//借位
	while(index1>=0){
		if(arr1[index1]<0){
			arr1[index1]+=10;
			arr1[index1-1]-=1;
		}
		--index1;
	}
}

//乘法函数
void mul(int* arr1,int length1,int* arr2,int length2){ 
	int sum(0);
	//开辟一个空间存储乘积
	int result[500]={0};
	for(int i=0;i<length1;++i){ 
		sum=0;
		for(int j=0;j<length2;++j){
			//两个数字的乘积
			sum=arr1[i]*arr2[j] ;

			//如果乘积大于等于10
			if(sum>=10){
				//乘法需要计算他的位置,例如10乘以10,则在百位
				result[i+j]+=sum%10;
				//进位
				result[i+j+1]+=sum/10;
			}
			else{
				result[i+j]+=sum;
			}	
		}
	}
	int full(0);
	//保存乘积的数组,处理进位
	for(int n=0;n<500;++n){ 
		if(result[n]>=10){
			full=result[n]/10;
			result[n]%=10;
			result[n+1]+=full;
		}
	}
	print(result,500);
}



int main(){
	string str1,str2;
	cin>>str1>>str2;


	int array1[500]={0},array2[500]={0};
	
	std::string::size_type length1=str1.size();
	std::string::size_type length2=str2.size();

	int index(0);
	//读入数组
	for(int i=length1-1;i>=0; --i){ 
		array1[index++]=CharToInt(str1[i]);  
	} 
	index=0;
	for(int j=length2-1;j>=0;--j){  
		array2[index++]=CharToInt(str2[j]); 
	} 
	mul(array1,length1,array2,length2);
//	print(array1,500); 
	return 0;
}

Java大数模板——加法、减法、乘法、除法、开方、求余

1、BigInteger的运算 import java.math.BigInteger; import java.util.Scanner; public class Main { publi...
  • huanhuanxiaoxiao
  • huanhuanxiaoxiao
  • 2017年08月30日 19:32
  • 288

大数的加法,减法,乘法

最近在研究算法,其中用到了大数的乘法,于是便对以前写过的大数的加法和减法,放在一起做了各总结,写了个BigData类 如有不完善的地方还请指正。 代码如下: package com.zjianh...
  • u013454746
  • u013454746
  • 2016年03月08日 23:23
  • 347

02 概率论与数理统计之概率定义、加法公式、减法公式、乘法公式

02 概率论与数理统计之概率定义、加法公式、减法公式、乘法公式
  • duan_zhihua
  • duan_zhihua
  • 2017年09月26日 19:44
  • 374

【数据结构与算法】String大数加减乘除(非负整数)

leetcode上一题使用String完成大数乘法,鉴于之前华为机试也考到过大数减法,这里做一个大数运算的专题。 说到底,大数运算考察的还是对运算的理解,我们完全可以通过模拟手算来进行。 注意stri...
  • woxiaohahaa
  • woxiaohahaa
  • 2016年04月12日 21:50
  • 1864

大数乘法(加法)运算

1、直接进行整型大数之间的乘法很容易导致数据存储溢出,可以采用数组存储计算得到的每一位 #include #include int main() { int n; int a[1...
  • dazhong159
  • dazhong159
  • 2012年07月30日 10:37
  • 1941

记录——《C Primer Plus (第五版)》第八章编程练习第八题

编写一个程序,显示一个菜单,为您提供加法、减法、乘法或除法的选项。获得您的选择后,该程序请求两个数,然后执行您选择的操作。该程序应该只接受它所提供的菜单选项。它应该使用float类型的数。并且如果用户...
  • zgscsed
  • zgscsed
  • 2015年09月28日 19:31
  • 504

大数加法、大数乘法、大数减法。Swift。

Github地址:https://github.com/kptanjunhao/calculator/blob/master/LongNumOperation.swift import Foun...
  • u011653429
  • u011653429
  • 2016年04月21日 17:17
  • 233

8.8编写一个程序,显示提供加法、减法、乘法的菜单,该程序只接受菜单提供的选项,程序提示用户输入两个数字......

#include char get_choice(void); int check_first_input (void); int check_second_input (void); float...
  • qq_36324796
  • qq_36324796
  • 2018年01月04日 12:24
  • 43

只使用加法实现减法,乘法和除法 [# 68]

问题: 给你两个整数 a 和 b,仅仅使用加法,实现 a - b, a * b, a / b。 分析: 对于减法,因为 a - b = a + (-1) * b, 换句话说,我们只要得到 b 的...
  • beiyeqingteng
  • beiyeqingteng
  • 2012年01月02日 02:27
  • 8269

BigDecimal 加减乘除

在java 里面,int 的最大值是:2147483647,现在如果想用比这个数大怎么办?换句话说,就是数值较大,这时候就用到了BigDecimal  下载整理了一下BigDecimal 的加减乘...
  • limingchuan123456789
  • limingchuan123456789
  • 2013年10月09日 21:05
  • 84716
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:大数减法、加法、乘法
举报原因:
原因补充:

(最多只允许输入30个字)