大数乘大数 、大数乘10以内的int数 模板

大数乘大数

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define range 103
void multi(char a[],char b[],char s[])
{
	int i,j,k=0,alen=strlen(a),blen=strlen(b),sum=0,res[range][range]={0},flag=0;
	char result[range];
	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+=res[i+blen-1-j][j];
		
		result[k]=sum%10;
		k++;
		sum/=10;
	}
	for(i=blen-2;i>=0;i--)
	{
		for(j=0;j<=i;j++)
		sum+=res[i-j][j];
		
		result[k]=sum%10;
		k++;
		sum/=10;
	}
	
	// 处理最后的进位 
	if(sum)
	{
		result[k]=sum;
		k++;
	}
	
	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';
	printf("%s\n",s);
}
int main()
{
	char a[range],b[range],res[range];
	cin>>a>>b;
	multi(a,b,res);
	return 0;
}

先用其中一个数中的每一位乘另外一个数的每一位,放到相应的位置,

举个例子:

假如:b:12345  a: 934

结果二维数组为

下面是核心代码:

for(i=alen-1;i>=0;i--)
	{
		for(j=blen-1;j>=0;j--)
		sum+=res[i+blen-1-j][j];
		
		result[k]=sum%10;
		k++;
		sum/=10;
	}
	for(i=blen-2;i>=0;i--)
	{
		for(j=0;j<=i;j++)
		sum+=res[i-j][j];
		
		result[k]=sum%10;
		k++;
		sum/=10;
	}

第一个循环:

他第一个指的元素为res[2][4],之后访问的元素为res[3][3]、res[4][2]、res[5][1]、res[6][0](这些都为0) 结果为20,保留0,进位为2

当i==1时,访问res[1][4]、res[2][3]、res[3][2]、res[4][1]、res[5][0]  结果为31,加上刚才的2,保留3,进位3

i==0 时,类似

第二个大循环

大数乘10以内的数:

#include<iostream>
#include<string.h>
using namespace std;
#define range 200
void multi(char a[],char res[],int n)
{
	int i,j,len=strlen(a),add=0,tem=0;
	int temp[range];
	for(i=0;i<len;i++)           // 首尾逆置 ,转换为int数组 
	temp[len-1-i]=a[i]-'0';
	for(i=0;i<len;i++)          // 模拟类的题,一般都是从数的尾部开始处理的 
	{
		temp[i]=temp[i]*n+add;
		add=temp[i]/10;
		temp[i]=temp[i]%10;
	}
	if(add)                       // 处理最后的进位 
	{
		temp[len]=add;
		len+=1;
	}
	for(i=0;i<len;i++)           // 在进行一次逆置 
	{
		res[len-1-i]=temp[i]+'0';
	}
	res[len]='\0';
	for(i=0;i<len;i++)
	printf("%c",res[i]);
}
int main()
{
	char a[range],res[range];
	int n;
	cin>>a>>n;
	multi(a,res,n);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41325698/article/details/88929961