C语言大数乘法---以蓝桥杯试题(基础练习 阶乘计算)为例

大数乘法有很多种的算法,今天我是模拟竖式乘法用于解决大数乘法。

以下便是大数乘法的代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#define MAX 1000

using namespace std;

char beMultiplier[MAX]; //被乘数 
char multiplier[MAX];  //乘数 
int result[MAX];

int getCount(char a[]){
	int count = 0;
	for(int i=0;;i++)
		if(a[i]=='X') break;
		else count++;
	return count-1;
}

char  multiplication(char bemu[],char mu[]){
	int bCount = getCount(bemu);
	int mCount = getCount(mu);
	
	for(int i=mCount-1;i>=0;i--){ //从乘数最后一位开始乘 
		int nowx = mu[i]-'0';
		int spos = mCount - i - 1;
		int c = 0; //进位 
		int bpos = 0;
		for(int j=bCount-1;j>=0;j--){
			int nowy = bemu[j]-'0';
			int m = nowx*nowy; //乘积 
			int r = m%10; //余数
			result[bpos+spos] += r;
			c = m/10; 
			result[bpos+spos+1] += c;
			if(result[bpos+spos]>=10){
				result[bpos+spos+1] += result[bpos+spos]/10;
				result[bpos+spos] = result[bpos+spos]%10;
			}
			bpos++;
		} 
	}
	int flag = 0;
	for(int i=MAX;i>=0;i--){
		if(result[i]!=0) flag=1;
		if(flag) cout<<result[i];
	}
}

int main()
{
	memset(result,0,sizeof(result));
	memset(beMultiplier,'X',sizeof(beMultiplier));
	memset(multiplier,'X',sizeof(multiplier));
	cin>>beMultiplier>>multiplier;
	multiplication(beMultiplier,multiplier);
	return 0;
}

接下来,在这个程序的基础上,我们来解决蓝桥杯的试题(基础练习 阶乘计算

原题题意:

试题 基础练习 阶乘计算

资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
  输入一个正整数n,输出n!的值。
  其中n!=123*…*n。
算法描述
  n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。
  将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。
  首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。
输入格式
  输入包含一个正整数n,n<=1000。
输出格式
  输出n!的准确值。
样例输入
10
样例输出
3628800

在前面大数乘法基础上,我们添加了一个可以将数字转换为字符类型数组的函数,便于我们循环。

整个题就是进行n次大数乘法,很基础。

当然,这道题不需要这么麻烦的进行模拟。

最终代码为:

#include<iostream>
#include<cstdio>
#include<cstring>
#define MAX 3000

using namespace std;

char beMultiplier[MAX]; //被乘数 
char multiplier[MAX];  //乘数 
int result[MAX];

int getCount(char a[]){
	int count = 0;
	for(int i=0;;i++)
		if(a[i]=='X') break;
		else count++;
	return count;
}

char  multiplication(char bemu[],char mu[]){ //大数相乘 
	int bCount = getCount(bemu);
	int mCount = getCount(mu);
	for(int i=mCount-1;i>=0;i--){ //从乘数最后一位开始乘 
		int nowx = mu[i]-'0';
		int spos = mCount - i - 1;
		int c = 0; //进位 
		int bpos = 0;
		for(int j=bCount-1;j>=0;j--){
			int nowy = bemu[j]-'0';
			int m = nowx*nowy; //乘积 
			int r = m%10; //余数
			result[bpos+spos] += r;
			c = m/10; 
			result[bpos+spos+1] += c;
			if(result[bpos+spos]>=10){
				result[bpos+spos+1] += result[bpos+spos]/10;
				result[bpos+spos] = result[bpos+spos]%10;
			}
			bpos++;
		} 
	}
	int flag = 0,num=0;
	for(int i=MAX;i>=0;i--){ //获取结果的位数 
		if(result[i]!=0) flag=1;
		if(flag) {
			num++;
		}
	}
	flag = 0;
	for(int i=MAX;i>=0;i--){  //将结果存储在bemu数组中 
		if(result[i]!=0) flag=1;
		if(flag) {
			bemu[num-i-1] = result[i] +'0';
		}
	}
}

void set(char a[],int x){ //将数字存储在数组中 
	int i=0,t=x;
	while(t>0){
		t/=10;
		i++;
	}
	while(x>0){
		int c = x%10;
		a[i-1] = c+'0';
		x /= 10;
		i--;
	}
}

int main()
{
	int n;
	cin>>n;
	memset(beMultiplier,'X',sizeof(beMultiplier));  //初始化被乘数数组 
	set(beMultiplier,1);
	for(int i=1;i<=n;i++){  //循环n次乘法 
		memset(result,0,sizeof(result));
		memset(multiplier,'X',sizeof(multiplier));
		set(multiplier,i); 
		
		multiplication(beMultiplier,multiplier);
	}
	for(int i=0;i<MAX;i++){  //输出结果 
		if(beMultiplier[i]=='X') break;
		else cout<<beMultiplier[i];
	}
	cout<<endl;
	return 0;
}

代码粗陋,还请海涵。

发布了21 篇原创文章 · 获赞 41 · 访问量 3103

猜你喜欢

转载自blog.csdn.net/the_sangzi_home/article/details/104783635