C语言多位数乘法

  1. 实现思想:乘法的部分积思想,也就是把手算的过程代码化而已。
  2. 存储数据:因为PC最多支持64位整型存储,所以结果用数组以字符串形式保存。
  3. 代码说明:理论上只要定义的数组长度足够大,可以运算任意位的乘法。
#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--;		//指向 参数1 最后一位
		p_buffer = buffer;
		while (*p_buffer != '\0')	//清空buffer
		{
			*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 == &para1[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')		//结果右移1位
		{
			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')		//将结果前面的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("计算结果:%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;
}

运算结果

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的C语言多位数计算器的实现代码: ```c #include<stdio.h> #include<string.h> #define MAX 100 int stack[MAX]; //定义栈 int top = -1; //栈顶指针初始化为-1 //将字符转换为整型数字 int charToInt(char c) { return c - '0'; } //将整型数字转换为字符 char intToChar(int num) { return num + '0'; } //入栈操作 void push(int num) { if(top == MAX - 1) { //栈满 printf("Stack is full, can't push element.\n"); return; } top++; //栈顶指针加1 stack[top] = num; //将元素入栈 } //出栈操作 int pop() { if(top == -1) { //栈空 printf("Stack is empty, can't pop element.\n"); return -1; } int num = stack[top]; //取出栈顶元素 top--; //栈顶指针减1 return num; } //计算两个数字的加法 int add(int a, int b) { return a + b; } //计算两个数字的减法 int subtract(int a, int b) { return a - b; } //计算两个数字的乘法 int multiply(int a, int b) { return a * b; } //计算两个数字的除法 int divide(int a, int b) { return a / b; } //判断字符是否为数字 int isDigit(char c) { return c >= '0' && c <= '9'; } //计算表达式的值 int calculate(char* expression) { int len = strlen(expression); int i = 0; while(i < len) { if(isDigit(expression[i])) { //如果是数字,将其转换为整型并入栈 push(charToInt(expression[i])); } else { //如果是运算符,从栈中取出两个数字进行运算,并将结果入栈 int num2 = pop(); int num1 = pop(); if(expression[i] == '+') { push(add(num1, num2)); } else if(expression[i] == '-') { push(subtract(num1, num2)); } else if(expression[i] == '*') { push(multiply(num1, num2)); } else if(expression[i] == '/') { push(divide(num1, num2)); } } i++; } return pop(); //最终栈中剩下的元素就是表达式的计算结果 } int main() { char expression[MAX]; printf("Please enter an expression: "); scanf("%s", expression); int result = calculate(expression); printf("Result: %d\n", result); return 0; } ``` 该计算器实现了四则运算(加、减、乘、除),可以计算多位数的表达式。用户只需输入表达式,程序会自动计算并输出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值