题解:P11062 【MX-X4-T2】「Jason-1」加法

P11062 题解

题面

原题传送门_

思路

首先一眼想到分讨。

  1. \(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\),再减去另一个数即可。
  2. \(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;
}
posted @ 2025-01-29 16:00  naroto2022  阅读(9)  评论(0)    收藏  举报