大数相乘的一些总结

蹲街弑〆低调 提交于 2020-02-06 18:20:02

##问题来源
一个整数n的阶乘可以写成n!,它表示从1到n这n个整数的乘积。阶乘的增长速度非常快,例如,13!就已经比较大了,已经无法存放在一个整型变量中;而35!就更大了,它已经无法存放在一个浮点型变量中。因此,当n比较大时,去计算n!是非常困难的。

##一段比较完善的代码

int main(){
	int n;
	cin>>n;
	int t;//进位 
	int m;//数组下标 
	int maxsize=1;//数组最大长度 
	int ans[1000]={0};
	ans[0]=1;
	for(int i=2;i<=n;i++){
		t=0;
		m=0;
		while(m<maxsize){
			int s=ans[m]*i+t;
			ans[m]=s%10;
			t=s/10;
			m++;
		}
		if(t!=0){// 比较关键的是进位的处理,进位不一定都是个位数,有时会很大,这时候要进行处理 
			if(t>10){
				int bi[11]={0},x=0;
				while(t>0){
					bi[x++]=t%10;
					t/=10;
				}
				for(int q=0;q<x;q++)
				ans[m++]=bi[q];
				maxsize+=x;
			}
			else{
				ans[m]=t;
				maxsize++;
			}
		}
	}
	for(int i=maxsize-1;i>=0;i--)//逆序输出数组,即为阶乘的值 
	cout<<ans[i];
	cout<<endl;
	for(int x=0;x<maxsize;x++){//输出最右边第一个非零数 
		if(ans[x]!=0){
			cout<<ans[x];
			break;
		}
	}
	return 0;
}

总结

1.每次循环不要忘了对进位进行初始化,即t=0;
2.进位t不一定是个位数,有时会是一个比较大的数字,当循环到最后一位的时候
数组要增加的位数就不止是一位了,所以要把t每一位拆开来存到一个新建的数组中,
然后再把新数组里面t的每一位,顺序赋值给结果数组进位的位置。
3.大数相乘其实很简单,结果数组的每一位与要乘的数相乘,结果的个位
还给原数组对应的位置,剩余几位作为进位,加入循环。
Eg:147*35,7*35=245(5代替结果数组7的位置,24作为进位),
4*35+24=164(4代替结果数组4的位置,16作为进位),
1*35+16=51(1代替结果数组1的位置,5作进位)。
得到结果数组ans={5,4,1,5};逆序输出得到答案5145.
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!