大数减法算法

简介:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 功能:实现两个大数减法运算
// 参数:source1--被减数
//       source2--减数
//       result --计算结果
// 返回值:计算结果为正数,返回'+',否则返回'-'
char Minus(char *source1, char *source2, char *result)
{
	int length1 = strlen(source1); // 被减数的长度
	int length2 = strlen(source2); // 减数的长度
    int i, j, k = 0;
	int temp; // 临时存放位相减的结果
	int bit = 0; // 借位,1表示需要借位,0表示不需要借位
	char ch; // 用于交换

	for (i = length1 - 1, j = length2 - 1; i >= 0 && j >= 0; --i, --j)
	{
		// 计算两个位之间的差值,同时要考虑借位
		temp = (source1[i] - '0') - (source2[j] - '0') - bit; 

		if (temp < 0) // 需要借位
		{
			bit = 1;
			result[k++] = temp + 10 + '0';
		}
		else// 不需要借位
		{
			bit = 0;
			result[k++] = temp + '0';
		}
	}

	while (i >= 0) // length1 > length2的情况,结果为正数,将剩余数据赋值给计算结果数组
	{
		temp = source1[i--] - '0' - bit;
		if (temp < 0) // 需要借位
		{
			bit = 1;
			result[k++] = temp + 10 + '0';
		}
		else
		{
			bit = 0;
			result[k++] = temp + '0';
		}
	}

	while (j >= 0)// length1 < length2的情况,结果为负数,将剩余数据赋值给计算结果数组
	{
		temp = 10 - bit - (source2[j--] - '0');
		result[k++] = temp + '0';
	}

	// 对仍有进位的情况考虑,主要分两种:一种是strlen(p1)<strlen(p2),另一种是p1-p2<0,这两种情况bit为1
	if (bit == 1)
	{
		// 最低位肯定不会被借位,所以不需要减去借位
		// 只会向高位借位
		result[0] = 10 - (result[0] - '0') + '0'; 
		for (i = 1; i < k; i++)
		{
			result[i] = 10 - (result[i] - '0') - bit + '0';
		}
	}

    for (i = k - 1, j = 0; i >= j; --i, ++j)
    {
		ch = result[i];
		result[i] = result[j];
		result[j] = ch;
    }
	result[k] = '\0';
    
	if (bit == 1)
	{
		return '-';
	}
	else
	{
		return '+';
	}
}

int main()
{
	char source1[1000];
	char source2[1000];
	char result[1001];
	char op;

	scanf("%s%s", source1, source2);
	op = Minus(source1, source2, result);

	if (op == '-')
	{
		printf("-");
	}
	printf("%s\n", result);

	return 0;
}

目录
相关文章
|
3月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1 算法训练 区间k大数查询
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1 算法训练 区间k大数查询
18 0
|
9月前
|
算法
基础算法(大数操作 前缀和 差分)
基础算法(大数操作 前缀和 差分)
45 0
|
11月前
|
分布式计算 算法 搜索推荐
【经典算法问题 一】海量数据中找出前k大数(topk问题)
【经典算法问题 一】海量数据中找出前k大数(topk问题)
116 0
|
12月前
|
算法 C++ Python
【每日算法Day 82】面试经典题:求第K大数,我写了11种实现,不来看看吗?
【每日算法Day 82】面试经典题:求第K大数,我写了11种实现,不来看看吗?
|
算法
经典算法题-大数相加&数字字符串相加
leetcode:415. 字符串相加题链 这是一个校招面试时候,手写频率比较高的一个算法题,这里给大家分享三种方法: 一个常规解法,两个清奇的思路
算法零基础——大数四则运算
算法零基础——大数四则运算
算法零基础——大数四则运算
|
存储 算法 C语言
二十个一乘以二十个二等于多少?C语言经典算法设计之大数乘法
二十个一乘以二十个二等于多少?C语言经典算法设计之大数乘法
1633 0
|
算法
经典算法详解(2)寻找数组中的次大数
题目:10个互不相等的整数,求其中的第2大的数字,要求数组不能用排序,设计的算法效率越高越好。 1 #include 2 3 using namespace std; 4 5 int max_second(int *arr,int n) { 6 int max_first...
1127 0
|
算法 机器学习/深度学习 人工智能
算法训练 区间k大数查询
问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。 输入格式 第一行包含一个数n,表示序列长度。
812 0
|
算法 Serverless 存储
[算法题] 大数相乘
#include "oj.h" #include #include #define OK 0 #define ERROR -1 /* 函数声明 */ void calc1(char* pcStrA, int iLenA, int* piTmp, int num); ...
864 0