
/*
题目不难,一个大数减法,一个大数的比较,关键是边界条件的检查
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int code[10] = {0,1,2,-1,-1,5,9,-1,8,6}; //这个是0-9旋转之后的数字,-1表示旋转之后出错
/*
大数的减法
*/
void minus(char s[1000],char s1[1000])
{
int k = 0;
for(int i=strlen(s) - 1;i> -1;i--) //注意此时倒着计算,是从 strlen(s) - 1开始,不是从 strlen(s)
{
if(s[i] < (s1[i] + k))
{
//s[i] = 10 + s[i] - s1[i] - k; //做减法后还要转换成字符,也就是加上 '0'
s[i] = 10 + s[i] - s1[i] - k + '0';
k = 1;
}
else
{
s[i] = s[i] - s1[i] - k + '0';
k = 0;
}
}
bool flag = false; //由于结果的高位也就是数组的前面可能出现 0,而这些 0 是没有必要输出的。
for(int j=0; j<strlen(s);j++)
{
if(flag)
{
printf("%c",s[j]);
continue;
}
if(s[j] == '0')
continue;
// s[j] = '\0';
else
{
printf("%c",s[j]);//别忘了这个,这个边界要注意
flag = true;
}
}
printf("\n");
}
int cmp(char s[1000],char s1[1000])
{
if(s[0] > s1[0]) //如果最高位不同
{
return 1;
}
else if((s[0] < s1[0]))
{
return -1;
}
else if(s[0] == s1[0]) //最高位相同
{
int k = 0;
while(s[k] == s1[k] && k < strlen(s)) //这个地方表示相同则一直向后走,
k++;
/*
这被注释掉两个语句出现的原因是刚开始考虑的是此时的s[k] != s1[k],所以要回退一下,
因此如果两个数字完全相同的话,k 会退后就是 strlen(s) - 1,不是strlen(s)
但是下面的操作直接是从不相等的部分开始的,所以没有必要回退
*/
//k --;
//if(k == strlen(s1) - 1)
if(k == strlen(s)) //可能有两个数字相等的情况。
return 0;
else if(s[k] > s1[k])
return 1;
else
return -1;
}
}
int main()
{
char str[1000];
char str1[1000];
int time = 0;
freopen("in.txt","r",stdin);
scanf("%d",&time);
for(int i=0;i<time;i++)
{
memset(str,'\0',sizeof(str));
memset(str1,'\0',sizeof(str1));
scanf("%s",str);
int j = 0;
int len = strlen(str);
while(j< len)
{
if(code[str[j] - '0'] == -1)
break;
str1[len - j - 1] = code[str[j] - '0'] + '0';
j ++;
}
if(j < len)
{
printf("ERROR\n");
continue;
}
switch(cmp(str,str1))
{
case 0:
printf("0\n");
break;
case -1:
{
minus(str1,str);
break;
}
case 1:
minus(str,str1);
break;
}
}
return 0;
}
/*
int main() //这个方案是错误的是因为没有考虑大数的问题
{
int time;
int num;
freopen("in.txt","r",stdin);
scanf("%d",&time);
for(int i=0;i<time;i++)
{
scanf("%d",&num);
int tmpNum = num,newNum =0,tmp;
int j = 0;
while(tmpNum != 0)
{
if( code[tmpNum % 10] == -1)
break;
newNum = code[tmpNum % 10] + newNum * 10;
j++;
tmpNum = tmpNum /10;
}
if(tmpNum != 0)
printf("ERROR\n");
else if(num > newNum)
printf("%d\n",num - newNum);
else
printf("%d\n",newNum - num);
}
fclose(stdin);
return 0;
}
*/
水题一个,对我来说关键的是 边界条件的检查
本文探讨了大数减法与比较的关键算法实现,特别关注于边界条件的正确处理,确保程序在处理极端情况时不崩溃。
2891

被折叠的 条评论
为什么被折叠?



