大整数 加减算法。已用vs 6.0验证

// test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <string.h>

#define uint8_t unsigned char 
#define uint32_t unsigned long


uint8_t numadd2[100] = {'2','1'};
uint8_t numadd1[100] ={'1'};
uint8_t numadd[102] = {0};

uint32_t CAL_len(uint8_t * buf)
{
	uint32_t len =0; 
	if(buf == NULL)
	{
		printf("Cal len input error\r\n");
		return 0;
	}
	while(*buf != '\0')
	{
		len++;
		buf++;       
	}
	return len;
}
bool Ascii_to_dec(uint8_t * arr ,uint8_t *arr_out)
{
	uint32_t len =0; 
	uint8_t *buf_in = arr;
	uint8_t *buf_out = arr_out;
	if(buf_in == NULL)
	{
		printf("CAscii_to_dec input error\r\n");
		return  false;
	}
		printf( "\r\n" );
	while(*buf_in != '\0')
	{
		if( 0x30> (*buf_in) || 0x39< (*buf_in))
			{
				printf( "Ascii_to_dec not in \'0\' -\'9\'"  );
				return false ;
			}
			else
				{
					*buf_out = *buf_in - 0x30; 
					printf( "buf_out = %d\r\n" , *buf_out  );
				}
		buf_in++;   
		buf_out++;
	}
	return true;


}
bool dec_to_ascii(uint8_t * arr ,uint8_t *arr_out , uint32_t  len)
{
	
	uint8_t *buf_in = arr;
	uint8_t *buf_out = arr_out;
	if(buf_in == NULL)
	{
		printf("CAscii_to_dec input error\r\n");
		return false;
	}
	while(len--)
	{
			if(*buf_in >=0 && *buf_in <=9)
				{
					*buf_out = *buf_in + 0x30; 
				}
			else
				{
					*buf_out = *buf_in;
				}		
		buf_in++;   
		buf_out++;
	}
	return true;


}
void  chage_arr(uint8_t * buf , uint32_t len)
{
	uint32_t i = 0;
	uint8_t path = 0;
	for(i = 0 ; i < len/2 ; i++)
	{
		path  = buf[i] ;
		buf[i] = buf[len -1-i];
		buf[len -1-i] = path;
	}
	
}
//长度100个数的10 进制
void BigNum_Add(uint8_t  *num_out , uint8_t  *buf1, uint8_t  *buf2)
{
	uint32_t add1_len = 0;
	uint32_t add2_len =0;
	uint32_t num_idx = 0;
	uint8_t up_flag= 0;
	uint8_t add1[100] = {0};
	uint8_t add2[100] = {0};
	if(buf1 == NULL || buf2 == NULL || num_out == NULL)
	{
		printf(" arg error");
		return ;
	}

	add1_len = CAL_len(buf1);
	add2_len = CAL_len(buf2);
      
	if(add1_len == 0 && add2_len == 0)
	{
       printf("arg error of len \r\n" );	  	
	   return ;	
	}


	if(Ascii_to_dec(buf1,add1) == false)
	{
		return ;
	}
	if(Ascii_to_dec(buf2,add2) == false)
	{
		return ;
	}

	while(1)
	{
		if(add2_len !=0 && add1_len != 0 )
		{		 
			num_out[num_idx++] = ((*(add2+add2_len -1)) + (*(add1+add1_len -1) ) + up_flag)%10 ;
			if(((*(add2+add2_len -1)) + (*(add1+add1_len -1)) +up_flag) > 9)
			{
				up_flag = 1;
			}
			else
			{
				up_flag = 0;
			}
			add1_len--;
			add2_len--;
		}
		else if(add1_len == 0 && add2_len !=0)
		{	
				num_out[num_idx++] = ((*(add2+add2_len -1)) + up_flag)%10 ;
				if(((*(add2+add2_len -1))  +up_flag) > 9)
				{
					up_flag = 1;
				}else{
					up_flag = 0;
				}
				add2_len--;
		}
		else if(add2_len == 0 && add1_len !=0)
		{	
				num_out[num_idx++] = ((*(add1+add1_len -1)) + up_flag)%10 ;
				if(((*(add1+add1_len -1))  +up_flag) > 9)
				{
					up_flag = 1;
				}else{
					up_flag = 0;
				}
				add1_len--;	
		}
		else if(add2_len == 0 && add1_len ==0 )
		{
				if(up_flag)
				num_out[num_idx++] =  up_flag ;
				break;
				
		}
	}
	chage_arr(num_out ,num_idx );
	dec_to_ascii(num_out, num_out ,num_idx );
}

//长度100个数的10 进制
void BigNum_Sub(uint8_t  *num_out , uint8_t  *buf1, uint8_t  *buf2)
{
	uint32_t add1_len = 0;
	uint32_t add2_len =0;
	uint32_t num_idx = 0;
	uint8_t up_flag= 0;
	uint8_t i=0;
	uint8_t ico = 0;
	uint8_t arrmin = 0;
	uint8_t *arr_max = NULL;
	uint8_t *arr_min = NULL;
	uint32_t arr_max_len = 0;
	uint32_t arr_min_len = 0;
	uint8_t  *add1 = buf1;
	uint8_t  *add2 = buf2;
	if(add1 == NULL || add2 == NULL || num_out == NULL)
	{
		printf(" arg error");
		return ;
	}

	add1_len = CAL_len(add1);
	add2_len = CAL_len(add2);
      
	if(add1_len == 0 && add2_len == 0)
	{
       printf("arg error of len \r\n" );	  	
	   return ;
		
	}


	if(Ascii_to_dec(add1,add1) == false)
	{
		return ;
	}
	if(Ascii_to_dec(add2,add2) == false)
	{
		return ;
	}

	if(add1_len > add2_len)
	{
		arr_max_len = add1_len;
		arr_max = add1;
		arr_min_len = add2_len;
		arr_min = add2;
		ico = 1;
	}
	else if(add1_len < add2_len)
	{
		arr_max_len = add2_len;
		arr_max = add2;
		arr_min_len = add1_len;
		arr_min = add1;
	}
	else 
	{
			arr_max_len = arr_min_len = add1_len;
			for(i = 0; i < add1_len ; i++)
			{
				if(add1[i] > add2[i])
				{
					arr_max = add1;
					arr_min = add2;
					ico = 1;
					break;
				}
				else if( add2[i] > add1[i])
				{
					arr_max = add2;
					arr_min = add1;
					break;
				}
			}
			if(i == add1_len )
			{
				printf(" sub = 0\r\n");
				return ;
			}
	}
	while(1)
	{
		if(arr_min_len == 0 )
			{
				arrmin = 0;
			}
			else 
			{
				arrmin = *(arr_min+arr_min_len -1);
			}
			num_out[num_idx++] = ((*(arr_max+arr_max_len -1)) - arrmin -up_flag  + 10)%10 ;
			if((*(arr_max+arr_max_len -1) - up_flag) < arrmin )
			{
				up_flag = 1;
			}
			else
			{
				up_flag = 0;
			}
		if(arr_max_len> 0)
		arr_max_len--;
	    if(arr_min_len> 0)
		arr_min_len--;
	
	if(arr_max_len == 0 && arr_min_len ==0)
		{
				if(ico == 0)
				{
					num_out[num_idx++] = '-';
				}
				break;
				
		}
	}
	chage_arr(num_out ,num_idx );
	dec_to_ascii(num_out, num_out ,num_idx );
}
int main(int argc, char* argv[])
{
	printf("Hello World!\n");     
	BigNum_Add(numadd , numadd1, numadd2);
	printf(" \r\n");
	printf("%s\r\n" ,numadd );
    BigNum_Sub(numadd , numadd1, numadd2);
	printf("%s\r\n" ,numadd );
	while(1)
	{}

	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Li_凌澜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值