C语言实现大数相加和大数相乘

大数相加
	/**
	 * 大整数求和
	 * @param numA  大整数A
	 * @param numB  大整数B
	 */
	
	#include<stdio.h>
	#include<stdlib.h>
	#include<string.h>
	
	#define N 30  //定义存放大数的数组长度
	
	char* bigNumberSum(char numA[N],char numB[N]){
		int i,j,tmp,tag=0;
		int maxL;
		int lenA=strlen(numA),lenB=strlen(numB);
		int arrA[N]={0},arrB[N]={0}; //初始化arrA数组和arrB各元素为0
		int tmpRes[N]={0}; //初始化tmpRes数组各元素为0
		char *res;
		res=(char*)malloc(N*sizeof(char)); //由于后面要给res赋值,因此这里先动态分配内存
	
		maxL=lenA>lenB?lenA:lenB; //maxL表示较大整数的位数
	
		/*1、把两个大整数用数组逆序存储*/
		for(i=0;i<lenA;i++){
			arrA[i]=numA[lenA-1-i]-'0'; //char型数字转换为int型,转换方法:- '0' 
		}
		for(i=0;i<lenB;i++){
			arrB[i]=numB[lenB-1-i]-'0'; 
		}
	
	    /*2、遍历tmpRes数组,按位相加*/
		for(i=0;i<maxL+1;i++){ //存储数据的个数=较大整数位数+1
			tmp=tmpRes[i];
			tmp+=arrA[i];
			tmp+=arrB[i];
			if(tmp>=10){ //判断是否进位
				tmp=tmp-10; //留下个位
				tmpRes[i+1]=1;  //把进位的1填充到下一个位置
			}
			tmpRes[i]=tmp; //把个位填充到tmpRes数组的对应下标
		}
	
		/*3、把tmpRes数组再次逆序并转成字符串*/
		//存储数据的个数=较大整数位数+1
		for(i=maxL+1-1,j=0;i>=0;i--){ //i初始时使其指向tmpRes中有意义数据的最后一位
			if(!tag){
				if(tmpRes[i]==0) //如果有意义数据的最后一位为0,则跳过0,不让它记入res中
					continue; //从这里终止,然后进入下一次循环
				tag=1; 
			}
			res[j++]=tmpRes[i]+'0'; //int类型转化为char类型,转化方法:+ '0'
		}
		res[j]='\0'; //字符串结束标志
	
		return res;
	}
	
	int main(){
		char *res;
		res=bigNumberSum("426709752318","95481253129");
		printf("大数相加的结果为:%s\n",res);
		return 0;
	}
大数相乘
	/**
	 * 大整数求乘积
	 * @param numA  大整数A
	 * @param numB  大整数B
	 */
	
	#include<stdio.h>
	#include<stdlib.h>
	#include<string.h>
	
	#define N 30  //定义存放大数的数组长度
	
	char* bigNumberMultiply(char numA[N],char numB[N]){
		int i,j,tag=0;
		int lenA=strlen(numA),lenB=strlen(numB);
		int arrA[N]={0},arrB[N]={0}; //初始化arrA数组和arrB各元素为0
		int tmpRes[N]={0}; //初始化tmpRes数组各元素为0
		char *res;
		res=(char*)malloc(N*sizeof(char)); //由于后面要给res赋值,因此这里先动态分配内存
	
		/*1、把两个大整数用数组逆序存储*/
		for(i=0;i<lenA;i++){
			arrA[i]=numA[lenA-1-i]-'0'; //char型数字转换为int型,转换方法:- '0' 
		}
		for(i=0;i<lenB;i++){
			arrB[i]=numB[lenB-1-i]-'0'; 
		}
	
	    /*2、嵌套循环,整数B的每一位依次和整数A的所有数位相乘,并把结果累加*/
		for(i=0;i<lenB;i++){
			for(j=0;j<lenA;j++){
				//整数B的某一位和整数A的某一位相乘
				tmpRes[i+j]+=arrB[i]*arrA[j];
				//如果result某一位大于10,则进位,进位数量是该位除以10的商
				if(tmpRes[i+j]>=10){
					tmpRes[i+j+1]+=tmpRes[i+j]/10; //把进位的数值【十位】填充到下一个位置
					tmpRes[i+j]=tmpRes[i+j]%10; //把个位填充到tmpRes数组的对应下标
				}
			}
		}
	
		/*3、把tmpRes数组再次逆序并转成字符串*/
		//存储数据的个数=两整数位数之和
		for(i=lenB+lenA-1,j=0;i>=0;i--){ //i初始时使其指向tmpRes中有意义数据的最后一位
			if(!tag){
				if(tmpRes[i]==0) //如果有意义数据的最后一位为0,则跳过0,不让它记入res中
					continue; //从这里终止,然后进入下一次循环
				tag=1; 
			}
			res[j++]=tmpRes[i]+'0'; //int类型转化为char类型,转化方法:+ '0'
		}
		res[j]='\0'; //字符串结束标志
	
		return res;
	}
	
	int main(){
		char *res;
		res=bigNumberMultiply("93281","2034");
		printf("大数相乘的结果为:%s\n",res);
		return 0;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值