// 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;
}
大整数 加减算法。已用vs 6.0验证
于 2024-07-25 16:33:12 首次发布