湘大 XTU OJ 1214 A+B IV 题解:数位移动的本质+布尔变量标记+朴素模拟

一、链接

A+B IV

二、题目

题目描述

小明喜欢做a+b的算术,但是他经常忘记把末位对齐,再进行加,所以,经常会算错。 比如12+13,他把12左移了1位,结果变成了133。 小明已经算了一些等式,请计算一下他到底移动了多少位。

输入

第一行是一个整数K,表示样例的个数。 以后每行一个样例,形如a+b=c, 1≤a,b≤1e4;0≤c≤1e9

输出

每行输出一个样例的结果,以b为标准,a如果往左移n位,输出n,如果往右移n位,输出-n。 测试数据保证一定有解,如果存在多个解,输出左移的结果

样例输入

6
12+13=1213
12+13=1312
12+13=25
12+13=12013
12+13=133
12+13=142

样例输出

2
-2
0
3
1
-1

三、题意

数字移位表示什么意思,其实是表示乘以10的整数次方,然后把两个数字相加,输出整数次方是多少

四、代码

c++代码

#include

using namespace std;

int main()
{
	int t;//样例数
	scanf("%d",&t);
	
	while(t--)
	{
		int a,b,c,count=0;//被加数,加数,和,计数器
		bool flag=false;//标记
		scanf("%d+%d=%d",&a,&b,&c);
		
		if(a+b==c)	printf("0\n");//特判
		else
		{
			//往左移,本质就是把被加数乘10的count次方
			for(int i=1;i<=1e9;i*=10)
			{
				if(a*i+b==c)//表示找到了符合条件的数字
				{
					flag=true;
					break;
				}
				count++;
			}
			
			if(flag==true)	printf("%d\n",count);
			else
			{
				count=0;//重置计数器
				//右移,其实就是把加数乘以10的|count|次方
				for(int i=1;i<=1e9;i*=10)
				{
					if(a+b*i==c)
					{
						printf("%d\n",count);
						break;
					}
					count--;
				}
			}
		}
	}
	
	return 0;
}

c语言代码

#include
#include

int main()
{
	int t;
	scanf("%d",&t);
	
	while(t--)
	{
		int a,b,c,count=0;
		bool flag=false;
		scanf("%d+%d=%d",&a,&b,&c);
		
		if(a+b==c)	printf("0\n");
		else
		{
			for(int i=1;i<=1e9;i*=10)
			{
				if(a*i+b==c)
				{
					flag=true;
					printf("%d\n",count);
					break;
				}
				
				count++;
			}
			
			if(flag==false)
			{
				count=0;
				for(int i=1;i<=1e9;i*=10)
				{
					if(a+b*i==c)
					{
						printf("%d\n",count);
						break;
					}
					
					count--;
				}
			}
		}
	}
	
	return 0;
}

五、总结

1.如上所说,数字移位的本质是乘以10的整数次方,然后朴素模拟实现这个要求即可

2.首先进行一个特判,如果两个数字的和刚好等于第三个数,说明是运算正确的,所以直接输出0,表示不用移位

3.除了这种情况,就需要进行朴素模拟了:数字最大不会超过9个0,所以我们把循环定在从1到9个0,当然每一次是乘十,不然时间复杂度肯定过大。先分析左移的情况,左移是被加数乘以10的整数次方,找到了符合条件的就输出答案并且跳出循环

4.布尔变量标记:找到符合条件的做一次标记,每一次循环就把计数器增加一次

5.比如说把布尔变量初始化为false,找到左移的就把布尔变量标记为true,如果循环结束之后,布尔变量还是false,就表示找不到符合条件的左移的情况,说明是右移

6.右移就是把加数乘以10的整数次方,这个时候先把计数器归零,从0开始减小,每一次减小1,还是像上面循环一样,找到符合条件的,就输出答案,跳出循环

7.总而言之:数位移动本质+布尔变量标记+朴素模拟

六、精美图片

湘大 XTU OJ 1214 A+B IV 题解:数位移动的本质+布尔变量标记+朴素模拟_第1张图片

 

你可能感兴趣的:(算法竞赛,湘大,XTU,OJ,算法,数据结构)