题解:P11062 【MX-X4-T2】「Jason-1」加法
P11062 题解
题面
思路
首先一眼想到分讨。
- \(a\times b\geq0\),即 \(a,b\) 同正负或者有一个为 \(0\) 的时候,考虑到每一次 \(a\gets a+b\) 或 \(b\gets a+b\),只会不断地增加 \(\vert a-b\vert\),其的最小值一定为 \(\min\{\vert a\vert,\vert b\vert,\vert a-b\vert\}\),至于 \(\vert a\vert,\vert b\vert\) 怎么求其实很简单,令一个数变成 \(a+b\),再减去另一个数即可。
- \(a\times b<0\),即 \(a,b\) 一正一负,则可以考虑辗转相减,知道两者同正负,正确性显然,当然辗转相减会超时,不能一个个减,需要用到取余,也就是把代码中的
-
改成%
。
结束啦!!!赶紧打代码 A 了这道题!
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll long long
using namespace std;
ll a,b,T;
void write(ll n){if(n<0){putchar('-');write(-n);return;}if(n>9)write(n/10);putchar(n%10+'0');}
ll read(){ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
int main(){
// freopen("1.in","r",stdin);
T=read();while(T--){
a=read();b=read();
if(a==0||b==0) write(0);
else if(a*b>0){
a=abs(a);b=abs(b);
write(min(min(abs(a),abs(b)),abs(b-a)));
}
else{
while(a*b<0){
if(abs(a)>abs(b)) a%=b;
else b%=a;
}
write(min(abs(a),abs(b)));
}
putchar('\n');
}
return 0;
}