题目链接:点击打开链接
题目:
Description
小明今年才上一年级,加减法只会算加一和减一。老师就是喜欢看小明写不出题目的样子,所以给小明出了个难题:给出两个数字x,y,每次可以让数字的某一位加一或者减一(0减1变成9,9加1变成0)。问从x变到y至少要几次操作?小明虽然数学不好但是编程很强呀,他很快就得出了正确答案,现在看你的了~
注意:每次变换只能变动除前导零的数位。例如1109变成0109后不能变再成1109或者9109,但是单就一个数字0可以变成1或9。
Input
第一行是一个数字T(T<=10)表示数据组数
接下来T行,每行两个数字x,y(0<=x,y<=100000)
x和y不包含前导零
Output
输出包括T行,第i行对应第i组数据的答案.
如果x无法变成y,输出-1
Sample Input
3 10 11 99 100 52 75
Sample Output
1 -1 5
思路:
主要是开始没看到 0减1变成9,9加1变成0
认真看题目之后 发现第一个数的位数如果第一个数位数小于第二个数的位数直接输出-1
如果第一个数位数大于第二个数的位数 直接把多出来的变成前导0
剩下的数只要看是要加还是减 因为 0减1变成9,9加1变成0 所以要分情况讨论
还要考虑到最高位不能变为零 所以要另外判断
代码:
#include <algorithm>
#include <math.h>
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
// freopen("in.txt","r",stdin);
int t,len1,len2,num;
char s1[10],s2[10],ss1[10],ss2[10];
scanf("%d",&t);
getchar();
while(t--)
{
memset(ss1,'0',sizeof(ss1));
memset(ss2,'0',sizeof(ss2));
scanf("%s %s",s1,s2);
getchar();
len1=strlen(s1);
len2=strlen(s2);
int xx=0;
for(int i=len1-1; i>=0; i--)
{
ss1[xx]=s1[i];
xx++;
}
xx=0;
for(int i=len2-1; i>=0; i--)
{
ss2[xx]=s2[i];
xx++;
}
if(len1<len2)
{
printf("-1\n");
continue;
}
else
{
num=0;
for(int i=0; i<len1; i++)
{
if(i==(len2-1))//最高位不能变为零 要另外判断
{
int x=(ss1[i]-'0')-(ss2[i]-'0');
num+=abs(x);
}
else
{
if(ss1[i]<ss2[i])
{
int x1=(ss1[i]-'0')-(ss2[i]-'0');
int x2=(ss1[i]-'0')+10-(ss2[i]-'0');
int x=min(abs(x1),abs(x2));
num+=abs(x);
}
else if(ss1[i]>ss2[i])
{
int x1=(ss1[i]-'0')-(ss2[i]-'0');
int x2=(ss1[i]-'0')-10-(ss2[i]-'0');
int x=min(abs(x1),abs(x2));
num+=abs(x);
}
}
}
printf("%d\n",num);
}
}
return 0;
}