大数乘法有很多种的算法,今天我是模拟竖式乘法用于解决大数乘法。
以下便是大数乘法的代码:
#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;
}
代码粗陋,还请海涵。