大数乘法问题

由于高级程序语言数据类型有一定的范围,不能利用原子类型存储过大的数据,所以,大数的乘法问题对算法的初学者有一定的挑战性、练习性。以下是自己对大数乘法问题的解决,因为自己能力不行,没有完成代码的优化工作,仅仅利用此文章记录自己的学习过程。也希望各位大神指导指导。

一、问题:实现大数的乘法。

二、分析问题:

1、因为原子类型的范围限制,自己选用数组对大数进行存储(也可以用STL 的 vector)

2、分析乘法规律,进而实现乘法过程。

3、进位工作相对比较简单;用处理位次的数对10取模为本位次的数,对10整除加到高位次中去,循环进行几个。

三、代码实现及其相应的注释

#include <iostream>
#include <cstdio>
/*
		(1 0) 在数组中位次  
		1 2
	x	
		1 2
	----------
	    2 4
	  1 2
	---------
	  1 4 4
	  
	  该方法中的大数乘法,其实就是观察乘法的规律,总结起来,用一套一般性的方法进行实现。 
*/ 

const int M = 100; //允许的大数长度 
using namespace std;
void charTonum(char num1[],char num2[],int n1[],int n2[],int len1,int len2);//char转换成number,即int型 
void multiply(int num1[],int num2[],int result[],int len1,int len2); //完成大数乘法 
void show(int num[],int n);//输出函数 
int main(void){
	char num1[M],num2[M];
	cin>>num1>>num2;
//	cout<<num1<<num2;
	int len1 = strlen(num1);
	int len2 = strlen(num2);
	int number1[len1];
	int number2[len2];
	
	
	int result[len1 + len2];
	for(unsigned int i = 0;i < len1 + len2; i ++)  result[i] = 0;
	
	charTonum(num1,num2,number1,number2,len1,len2);
	multiply(number1,number2,result,len1,len2);
	
//	show(number1,len1);
	show(result,len1+len2);
	return 0;
}
void charTonum(char num1[],char num2[],int n1[],int n2[],int len1,int len2){
	int temp = len1;
	for(unsigned int i = 0;i < temp;i ++){
		n1[i] = num1[len1 - 1] - '0';
		len1 --;
	}
	temp = len2;
	for(unsigned int i = 0;i < temp;i ++){
		n2[i] = num2[len2 - 1] - '0';
		len2 --;
	}
}
void multiply(int num1[],int num2[],int result[],int len1,int len2){
	for(unsigned int i = 0;i < len1;i ++)
		for(unsigned int j = 0;j < len2;j ++)
			{
				result[i + j] += num1[i] * num2[j];
//				cout<<"result->"<<result[i + j]<<" "<<num1[i] * num2[j]<<endl;
//				cout<<i<<"->"<<num1[i]<<" "<<j<<"->"<<num2[j]<<" "<<endl; 
			}
	for(unsigned int i = 0;i < len1+len2;i ++)	cout<<result[i]<<" ";
	
	cout<<endl;
	
	for(unsigned int i = 0;i < len2 + len1;i ++)//处理进位 
		if(result[i] >= 10){
			result[i + 1] += result[i]/10;
			result[i] %=10;
		}
}
void show(int num[],int n){
	bool flag = true;
	
	for(int i = n - 1;i >= 0; i --){
		if(flag&&num[i] == 0) continue;
		
		if(num[i] != 0)	flag = false;
		
		cout<<num[i];
	}
	
		
//	cout<<endl<<n;// 结果数组的长度 
}

欢迎转载,欢迎批评指正!!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值