大整数相乘(aijud)

来源:互联网 发布:java从键盘赋值 编辑:程序博客网 时间:2024/04/30 03:50
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


void get_multiply(const char * str_num1,const char * str_num2)
{
int get_array_num1[15];
int get_array_num2[15];
int get_carry_bit[30] = {0};
int get_result_bit[30] = {0};
char get_outstr[30];
char *result;
char flag_num1;
char flag_num2;
int index = 0;
size_t len1 = 0;
size_t len2 = 0;
result = (char*)malloc(30);


if(str_num1 == NULL || str_num2 == NULL||(strlen(str_num1) == 0)||(strlen(str_num1) == 0))
{
return;
}


if(((*str_num1) == '0') || ((*str_num2) == '0'))
{
*result = '0';
*(result+1) = '\0';
}






if((*str_num1) == '-') 
{
flag_num1 = '-';
}
else
{
flag_num1 = '+';
}


if((*str_num2) == '-') 
{
flag_num2 = '-';
}
else
{
flag_num2 = '+';
}


if(flag_num1 == '-')
{
len1 = strlen(str_num1) - 1;
for(int i = len1; i > 0; i--)
{
get_array_num1[i - 1] = (*(str_num1+1) - '0');
str_num1++;
}
}
else
{
len1 = strlen(str_num1);
for(int i = len1; i > 0; i--)
{
get_array_num1[i - 1] = (*(str_num1) - '0');
str_num1++;
}
}






if(flag_num2 == '-')
{
len2 = strlen(str_num2) - 1;
for(int i = len2; i > 0; i--)
{
get_array_num2[i - 1] = (*(str_num2+1) - '0');
str_num2++;
}
}
else
{
len2 = strlen(str_num2);
for(int i = len2; i > 0; i--)
{
get_array_num2[i - 1] = (*(str_num2) - '0');
str_num2++;
}
}


/* 核心算法*/
    for(int i = 0; i < len2; i++)
{
for(int j = 0; j < len1; j++)
{
get_carry_bit[i+j+1] += (get_array_num2[i] * get_array_num1[j] + get_carry_bit[i+j] + get_result_bit[i+j])/10;
get_result_bit[i+j] = (get_array_num2[i] * get_array_num1[j] + get_carry_bit[i+j] + get_result_bit[i+j])%10;
get_carry_bit[i + j] = 0;
}
}
get_result_bit[len2 + len1-1] = get_carry_bit[len2 + len1-1];


for(int i = 0,j = len2+len1; j>=0; i++,j--)
{
get_outstr[i] = get_result_bit[j] + '0';
}
get_outstr[len1+len2+1] = '\0';
if(flag_num1 != flag_num2)
{
for(int i = 0; i < len1+len2+1; i++)
{
if(get_outstr[i] != '0')
{
get_outstr[i-1] = '-';
index = i-1;
break;
}


}
}
else
{
for(int i = 0; i < len1+len2+1; i++)
{
if(get_outstr[i] != '0')
{
index = i;
break;
}


}
}


for(int m = index,n=0; m <= len1+len2+1; m++,n++)
{
*(result+n) = get_outstr[m];
}



}




  








int main()
{
const char * str_num1 = "3";
const char * str_num2 = "176876876876";
get_multiply(str_num1,str_num2);
return 0;
}

0 0