每日一题洛谷P2142 高精度减法C语言(高精度算法)

每日一题洛谷P2142 高精度减法C语言(高精度算法)_第1张图片

代码中有详细的注释

#include
#include//bool类型,只会返回true/false
#include//strlen测量数组长度;strcpy复制数组
//判断A和B大小
bool compare(char A[],char B[]) {
	//测量A和B长度
	int len_A = strlen(A);
	int len_B = strlen(B);
	//如果位数不相等可以直接比大小
	//len_A > len_B会返回true(A大)/false(B大)
	if (len_A != len_B)return len_A > len_B;
	//如果位数相等,分为两种情况,第一种:两数不相等,则逐位比较
	for (int i = 0; i < len_A;i++) {
		//A[i] > B[i]会返回true(A大)/false(B大)
		if (A[i] != B[i])return A[i] > B[i];
	}
	//第二种:两数相等,则返回true(true代表不需要交换顺序)
	return true;
}
int main() {
	char A[10090] = { 0 };
	char B[10090] = { 0 };
	char C[10090] = { 0 };
	scanf("%s %s",A,B);
	//如果A>=B,则接收true,flag=1
	//如果AA就交换一下顺序
	int flag_change = 0;
	if (!flag) {
		//标记一下,别忘了算完要加负号
		flag_change = 1;
		//利用中间数组C来交换A和B
		strcpy(C, A);//表示把A的值复制给C
		strcpy(A, B);
		strcpy(B, C);
	}
	//重新测量一下两数的长度,因为要考虑到两数可能互换了
	int len_a = strlen(A);
	int len_b = strlen(B);
	//将字符串数组中的数据存入整型数组以便于计算
	int a[10090] = { 0 };
	int b[10090] = { 0 };
	//计算结果存入c中
	int c[10090] = { 0 };
	//在存入的同时逆序,确保个位对齐
	//比如123-11,如果不逆序,会出现百位-十位、十位-个位的情况
	for (int i = 0; i < len_a;i++) {
		a[len_a - i] = A[i] - '0';
	}
	for (int i = 0; i < len_b; i++) {
		b[len_b - i] = B[i] - '0';
	}
	//两数相减
	for (int i = 1; i <= len_a;i++) {
		//该位不够减则向下一位借1
		if (a[i] 0; i--) {
		printf("%d", c[i]);
	}
	//如果答案是0则单独判断
	if (!len_a)printf("0");
	return 0;
}

每日一题洛谷P2142 高精度减法C语言(高精度算法)_第2张图片

先用函数来比较A和B的长度,再用高精度减法来计算A-B的结果

后来,作者换了种思路,即使用strcmp函数,直接比较A和B的大小

每日一题洛谷P2142 高精度减法C语言(高精度算法)_第3张图片

#include
#include//strlen测量数组长度;strcpy复制数组;strcmp比较大小
int main() {
	char A[10090] = { 0 };
	char B[10090] = { 0 };
	char C[10090] = { 0 };
	scanf("%s %s", A, B);
	//比较大小
	int res = strcmp(A, B);
	if (res == 0)printf("0");
	else if (res < 0) {
		printf("-");
		//利用中间数组C来交换A和B
		strcpy(C, A);//表示把A的值复制给C
		strcpy(A, B);
		strcpy(B, C);
	}
	//测量一下两数的长度
	int len_a = strlen(A);
	int len_b = strlen(B);
	//将字符串数组中的数据存入整型数组以便于计算
	int a[10090] = { 0 };
	int b[10090] = { 0 };
	//计算结果存入c中
	int c[10090] = { 0 };
	//在存入的同时逆序,确保个位对齐
	//比如123-11,如果不逆序,会出现百位-十位、十位-个位的情况
	for (int i = 0; i < len_a; i++) {
		a[len_a - i] = A[i] - '0';
	}
	for (int i = 0; i < len_b; i++) {
		b[len_b - i] = B[i] - '0';
	}
	//两数相减
	for (int i = 1; i <= len_a; i++) {
		//该位不够减则向下一位借1
		if (a[i] < b[i]) {
			a[i] += 10;
			a[i + 1] -= 1;
		}
		c[i] = a[i] - b[i];
	}
	//如果借位导致把最高位借没了则要把长度缩小(如 100 - 99 ,a的长度是3但是结果长度是1)
	//此时 0 - 0 == 0 的情况上面已经判断过了,这里无需考虑
	while (c[len_a] == 0 )len_a--;
	//由于之前逆序相减,现在要逆序输出
	for (int i = len_a; i > 0; i--) {
		printf("%d", c[i]);
	}
	return 0;
}

但不是满分

每日一题洛谷P2142 高精度减法C语言(高精度算法)_第4张图片

测试点1数据:

每日一题洛谷P2142 高精度减法C语言(高精度算法)_第5张图片

因为strcmp无法直接比较数字大小,下图是比较规则

每日一题洛谷P2142 高精度减法C语言(高精度算法)_第6张图片

所以本题不能用strcmp

你可能感兴趣的:(洛谷,算法,算法,c语言,开发语言)