高精度之大数乘大数

上一篇说了简单的大数乘以小数的问题,绝大多数的问题解决不了。

现在我们来说一下大数乘以大数。

大数乘以大数也是用来模拟手算。

举个例子吧!

先从个位开始一个一个的乘 乘完个位然后再乘十位,乘十位的时候要和个位的想成的结果相加。

这里注意乘十位的时候 就不要和乘个位数字的结果中的最后一位相加了 。就是如图搓位。

就是这样 。

下面先贴上我的代码。

#include<iostream>
#include<string.h>
using namespace std;

void mult(char a[],char b[])
{
	int alen = strlen(a);
	int blen = strlen(b);
	if(alen%2)
	{
		for(int i=0;i<=alen/2;i++)
		{
			int t = a[i]-‘0‘;
			a[i]=a[alen-1-i]-‘0‘;
			a[alen-1-i]=t;
		}
	}
	else
	{
		for(int i=0;i<alen/2;i++)
		{
			int t = a[i]-‘0‘;
			a[i]=a[alen-1-i]-‘0‘;
			a[alen-1-i]=t;
		}
	}
	if(blen%2)
	{
		for(int i=0;i<=blen/2;i++)
		{
			int t=b[i]-‘0‘;
			b[i]=b[blen-1-i]-‘0‘;
			b[blen-1-i]=t;
		}

	}
	else
	{
		for(int i=0;i<blen/2;i++)
		{
			int t=b[i]-‘0‘;
			b[i]=b[blen-1-i]-‘0‘;
			b[blen-1-i]=t;
		}
	}
	int sum = 0;
	int s[200]={0};
	memset(s,0,sizeof(s));
	int k=0;
	for(int i=0;i<blen;i++)//这里操作了各位相乘 并把结果保留在了s中
	{
		k=i;
		for(int j=0;j<alen;j++)
		{
			sum=b[i]*a[j]+s[k]+sum;
			s[k++]=sum%10;
			sum=sum/10;
		}
		if(sum)
			s[k++]=sum;
	}
	for(int i=k-1;i>=0;i--)
	{
		cout<<s[i];
	}
	cout<<endl;
}

int main()
{
	char a[50],b[50];
	while(1)
	{
		cin>>a>>b;
		char c[100];
		mult(a,b);
	}
	system("pause");
	return 0;
}

代码很长主要是中间处理两个数组的时候我费了很多劲,这里完全可以不用这么做,重新开辟一个数组很方便的。代码很短。主要看中间想成的那部分代码。

下面我贴上模板中的代码,我没有看懂,因为我看到代码处理时用到了二维数组,我觉得二维数组局限性就大了,比如位数不能太多等等。所以我就没仔细研究。

看以看看模板中怎么处理的数组,把我的那部分替换掉。

#include<iostream>
#include<string.h>
using namespace std;

void mult(char a[],char b[],char s[])
{
	int i,j,k=0,alen,blen,sum=0,res[65][65]={0},flag=0;
	char result[65];
	alen=strlen(a);blen=strlen(b);
	for(i=0;i<alen;i++)
		for(j=0;j<blen;j++)
			res[i][j]=(a[i]-‘0‘)*(b[j]-‘0‘);
	for(i=alen-1;i>=0;i--)
	{
		for(j=blen-1;j>=0;j--)
		{
			sum=sum+res[i+blen-j-1][j];
			cout<<i+blen-j-1<<"  "<<res[i+blen-j-1][j]<<endl;
		}
		result[k]=sum%10;
		k=k+1;
		sum=sum/10;
	}
	for(i=blen-2;i>=0;i--)
	{
		for(j=0;j<=i;j++)
			sum=sum+res[i-j][j];
		result[k]=sum%10;
		k=k+1;
		sum=sum/10;
	}
	if(sum!=0){result[k]=sum;k=k+1;}
	for(i=0;i<k;i++)
		result[i]+=‘0‘;
	for(i=k-1;i>=0;i--)
		s[i]=result[k-1-i];
	s[k]=‘\0‘;
	while(1)
	{
		if(strlen(s)!=strlen(a)&&s[0]==‘0‘)
			strcpy(s,s+1);
		else
			break;
	}
}

int main()
{
	char a[50],b[50];
	cin>>a>>b;
	char c[100];
	mult(a,b,c);
	cout<<c<<endl;
	cout<<endl;
	cout<<endl;
	system("pause");
	return 0;
}

好了!

感谢自己坚持。

高精度之大数乘大数

时间: 2024-10-13 15:01:47

高精度之大数乘大数的相关文章

精度计算-大数乘大数

精度计算                     大数乘大数 本算法是用来计算一个大数(现有的数据类型无法表示的数)乘以一个大数(现有的数据类型无法表示的数). 算法思路是把大数的每一位都当做一个字符放入一个字符数组中,再把乘数的各个位与被乘数的各个位从最高位依次相乘,将结果存放在一个二维数组res中.例如计算12*12,res[0][0] = 1,res[0][1] = 2,res[1][0] = 2,res[1][1] = 4,那么最终结果的数组s,s[0] = res[0][0]= 1,s

精度计算-大数加大数

精度计算                大数加大数 本算法是用来计算一个大数(现有的数据类型无法表示的数)加上一个大数(现有的数据类型无法表示的数). 算法思路是把作为被加数和加数的大数的每一位都当做一个字符分别放入一个字符数组中,再把加数的各个位与被加数的各个位从最低位依次相加,将结果存放在一个字符指针中,最后再放入一个结果数组中. 下面是我的C语言实现过程 #include<stdio.h> #include<string.h> void add(char a[],char b

HDU高精度总结(java大数类)

  HDU1002   A + B Problem II [题意]大数相加 [链接]http://acm.hdu.edu.cn/showproblem.php?pid=1002 Sample Input 2 1 2 112233445566778899 998877665544332211 Sample Output Case 1: 1 + 2 = 3 Case 2: 112233445566778899 + 998877665544332211 = 1111111111111111110 代码

组合数学 + 大数乘法 + 大数除法 之 hdu 1261 字串数

//  [3/17/2015 JmingS] /* 此题可直接推导出公式: {(A1+A2+……+An)!} / {A1!A2!……An!} 由于 (12×26)! = 312! 只能通过数组来存储,所以又涉及『大数乘法』和『大数除法』, 大数实现的主要思想模拟手算,具体参考程序. */ 1 #include <iostream> 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstring> 5

(母函数 Catalan数 大数乘法 大数除法) Train Problem II hdu1023

Train Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 10372    Accepted Submission(s): 5543 Problem Description As we all know the Train Problem I, the boss of the Ignatius Train Sta

nyoj 114某种排序(水 大数+优化大数)

某种序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 数列A满足An = An-1 + An-2 + An-3, n >= 3 编写程序,给定A0, A1 和 A2, 计算A99 输入 输入包含多行数据 每行数据包含3个整数A0, A1, A2 (0 <= A0, A1, A2 <= 100000000) 数据以EOF结束 输出 对于输入的每一行输出A99的值 样例输入 1 1 1 样例输出 69087442470169316923566147 来源 水

大数乘以大数

#include<iostream> using namespace std; int main(){ char s1[100],s2[100]; int res[100]; while(cin>>s1>>s2){ memset(res,0,sizeof(res)); int len1=strlen(s1); int len2=strlen(s2); for(int i=0;i<len1/2;i++) swap(s1[i],s1[len1-i-1]); for(i

hdu 1023 Train Problem II 这题运用到大数相乘+大数相除+卡特兰数

Train Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6454    Accepted Submission(s): 3514 Problem Description As we all know the Train Problem I, the boss of the Ignatius Train Stat

高精度之大数乘小数

今天下载百度文库资料时发现了 发现了内蒙古电子信息学院的ACM模板. 打开看了一下刚开始就是高精度的计算问题. 于是我就写了写.说实话在我的心里对这些东西有点抵触.因为接触的时候没能很好的掌握所以以后遇到这样的问题总是逃避,虽然逼着自己也能写出来,但是就是不愿意去写. 今天看到一个人的博客让我受益很深.其实不是内容,当然内容也很好.让我感觉到,其实厉害的人不是有多大的成就,会多少别人听都没听过的知识,把一件小事情做好,做的自己满意这就是成功. 闲话不扯了,我们来说一下高精度乘法问题. 大数乘小数