大整数相乘(aijud)
2015-08-22 14:19
519 查看
#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;
}
#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;
}
相关文章推荐
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言内存对齐实例详解
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- 使用C语言详解霍夫曼树数据结构
- 探讨C语言的那些小秘密之断言
- C语言实现BMP转换JPG的方法
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置
- C语言查找数组里数字重复次数的方法
- C语言泛型编程实例教程
- C语言中使用lex统计文本文件字符数
- C语言进制转换代码分享
- 基于C语言fflush()函数的使用详解
- C语言单链队列的表示与实现实例详解
- 关于C语言除0引发的思考
- 深入分析C中不安全的sprintf与strcpy
- Lua教程(四):在Lua中调用C语言、C++的函数