高精度算法

/*任务:高精度,计算大数乘小数 
*
*参数:乘法函数mul参数为 被乘数a[],保存最终结果的ans数组,乘数b
*结果:ans数组中ans[0]为最高位,以此类推  
*/ 
#include <iostream>
#include <string.h>
using namespace std;
void mul(char a[],char ans[],int b) {
	     int i,j,s,len,c=0;     
		 char temp[1000];     
		 len=strlen(a); 
		 for (i=0;i<len;i++)         
		 	temp[len-i-1]=a[i]-'0';
		 for(j=0;j<len;j++){
			s=temp[j]*b+c;
			temp[j]=s%10;
			c=s/10;
		 }
		while(c){//记录进位 
				temp[len++]=c%10;
				c/=10;
   		}		 
    	for (i=0;i<len;i++)
			ans[len-1-i]=temp[i]+'0';
		ans[len]='\0'; 
		
		for(i=0;i<len;i++)
			cout<<ans[i];
		}
int main()
{
	char a[1000],ans[1000];
	int b;
	cin>>a>>b;
	mul(a,ans,b);
	return 0;
}


/*任务:高精度,计算大数加大数 
*
*参数:乘法函数mul参数为 被加数a[],加数b[],保存最终结果的ans数组
*结果:ans数组中ans[0]为最高位,以此类推  
*/ 
#include <iostream>
#include <string.h>
using namespace std;
int add(char a[],char b[],char ans[]) {
	     int i,j,s,len,c=0;
		 int temp_a[10000],temp_b[10000],temp_ans[10000];
		 memset(ans,0,sizeof(ans));
		 memset(temp_a,0,sizeof(temp_a));
		 memset(temp_b,0,sizeof(temp_b));
		 memset(temp_ans,0,sizeof(temp_ans));
		 len=max(strlen(a),strlen(b)); 
		 for (i=0;i<strlen(a);i++)         
		 	temp_a[strlen(a)-i-1]=a[i]-'0';
	 	 for (i=0;i<strlen(b);i++)         
		 	temp_b[strlen(b)-i-1]=b[i]-'0';
		 
		 for(j=0;j<len;j++){
			s=temp_a[j]+temp_b[j]+c;
			temp_ans[j]=s%10;
			c=s/10;
		 }
		 if(c) temp_ans[len++]=c;		 
    	 for (i=0;i<len;i++)
			ans[len-1-i]=temp_ans[i]+'0';
		 ans[len]='\0'; 		
		 
		 for(int i=0;i<len;i++)
			cout<<ans[i];
		 cout<<endl;
		}
int main()
{
	char a[1000],b[1000],ans[1000];
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	cin>>a>>b;
	add(a,b,ans);
	return 0;
}


/*任务:计算N!
*
*参数:阶乘函数fac的参数为N的值和保存最终结果的ans数组
*结果:ans数组中ans[0]为最高位,以此类推 
* 
*/ 
 
#include <stdio.h>
#include <string.h>
#define MAX 50000
void fac(int n,int*ans){
	int temp[1000]; 
	int len=1;	
	int i,j,c,s;
	memset(temp,0,sizeof(temp));
	memset(ans,0,sizeof(ans));
	temp[0]=1;
	for(i=1;i<=n;i++){
		c=0;
		for(j=0;j<len;j++){
			s=temp[j]*i+c;
			temp[j]=s%10;
			c=s/10;
		}
		while(c){//记录进位 
				temp[len++]=c%10;
				c/=10;
   		}
	}
	for (i=0;i<len;i++)
		ans[len-1-i]=temp[i];
	ans[len]='\0'; 
	for(i=0;i<len;i++)
		printf("%d",ans[i]);
	printf("\n");
} 
int main()
{
	int n,k,i,j;
	int ans[MAX];
	while(scanf("%d",&n)!=EOF)
		fac(n,ans);
	return 0;
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值