- 实现思想:乘法的部分积思想,也就是把手算的过程代码化而已。
- 存储数据:因为PC最多支持64位整型存储,所以结果用数组以字符串形式保存。
- 代码说明:理论上只要定义的数组长度足够大,可以运算任意位的乘法。
#include <stdio.h>
#define INPUT_BITLEN 50
#define OUTPUT_BITLEN INPUT_BITLEN * 2
#define ATOI(x) ((x) >= '0') ? ((x) - '0') : (0)
#define ITOA(x) (x) + (0x30)
unsigned char result[OUTPUT_BITLEN] = { 0 };
void fun_mul(unsigned char* para1, unsigned char* para2)
{
unsigned char* p1 = para1;
unsigned char* p2 = para2;
unsigned char buffer[INPUT_BITLEN + 1] = { 0 };
printf("\n");
for (int i = 0; *p2 != '\0'; p2++,i++)
{
unsigned char carray = 0;
unsigned char* p_buffer = buffer;
char* p_result = result;
p1 = para1;
while (*p1 != '\0')
p1++;
p1--;
p_buffer = buffer;
while (*p_buffer != '\0')
{
*p_buffer = '\0';
p_buffer++;
}
p_buffer = buffer;
unsigned char cnt = 0;
while (1)
{
unsigned char atoi1 = *p1 - '0';
unsigned char atoi2 = *p2 - '0';
unsigned char temp = atoi1 * atoi2;
if (cnt)
temp = 0;
temp += carray;
carray = (unsigned char)(temp / 10);
temp %= 10;
if (p1 == ¶1[0])
{
cnt++;
if (cnt > 2)
break;
}
else
p1--;
*p_buffer = ITOA(temp);
++p_buffer;
}
p_buffer = buffer;
for (int j = 0; j < i; j++)
printf(" ");
while (*p_buffer != '\0')
p_buffer++;
do
{
p_buffer--;
printf("%c", *p_buffer);
} while (p_buffer != &buffer[0]);
printf("\n");
carray = 0;
if (result[0] != '\0')
{
p_result = result;
while (*p_result != '\0')
p_result++;
*(p_result + 1) = '\0';
p_result--;
while (1)
{
*(p_result + 1) = *p_result;
if (p_result == &result[0])
break;
p_result--;
}
}
result[0] = '0';
p_buffer = buffer;
p_result = result;
carray = 0;
while (1)
{
char num1 = ATOI(*p_buffer);
char num2 = ATOI(*p_result);
unsigned char temp = num1 + num2;
temp += carray;
carray = (unsigned char)(temp / 10);
temp %= 10;
*p_result = temp + '0';
if (*p_buffer != '\0')
p_buffer++;
else if (!carray)
break;
p_result++;
}
}
}
int input_illegal(unsigned char para[])
{
unsigned char* p = para;
while (*p != '\0')
{
if ((*p > '9') || (*p < '0'))
return 1;
p++;
}
return 0;
}
int convert(unsigned char para[])
{
unsigned char* p_start = para;
unsigned char* p_end = para;
unsigned char* p_start1 = p_start;
int count = 1;
while (*p_end != '\0')
p_end++;
p_end--;
unsigned char* p_end1 = p_end;
while ((p_start != p_end) && ((p_start != p_end1) && (p_end != p_start1)))
{
*p_start ^= *p_end;
*p_end ^= *p_start;
*p_start ^= *p_end;
p_start1 = p_start;
p_end1 = p_end;
p_start++;
p_end--;
count++;
}
if (p_start == p_end)
count = count * 2 + 1;
else
count *= 2;
return count;
}
int main(char argc, char** argv)
{
#if 1
unsigned char multiplier[INPUT_BITLEN] = { 0 };
unsigned char multiplicand[INPUT_BITLEN] = { 0 };
printf("输入被乘数:\n");
scanf_s("%s", multiplicand, INPUT_BITLEN - 1);
if (input_illegal(multiplicand))
{
printf("被乘数输入错误!\n");
return 0;
}
printf("输入乘数:\n");
scanf_s("%s", multiplier, INPUT_BITLEN - 1);
if (input_illegal(multiplier))
{
printf("乘数输入错误!\n");
return 0;
}
fun_mul(multiplicand, multiplier);
int result_bit = convert(result);
while (result[0] == '0')
{
unsigned char* p_result = result;
while (1)
{
if (*p_result == '\0')
break;
*p_result = *(p_result + 1);
p_result++;
}
}
printf("%s\n", result);
printf("计算结果:");
unsigned char* p_result = result;
unsigned int count = 4 - (result_bit % 3);
while (1)
{
printf("%c", *p_result);
p_result++;
if (*p_result == '\0')
break;
if (!(count % 3))
{
printf(",");
count = 0;
}
count++;
}
#endif
return 0;
}