小w的a+b問題

鏈接:https://ac.nowcoder.com/acm/contest/923/A
來源:牛客網
 

大家一定都做過各大oj上面不同版本的A+B problem,如果現在反過來給你c,請你給我輸出一組a和b,使得a+b的和等於c呢?

這同樣還是一個簡單的問題。

 

我們假設某種語言中的32位整形被定義成int 類型,該語言中負整數以二進制補碼的形式儲存,第32位爲符號位,前31位爲數值位。例如-1就被存儲爲"1111 1111 1111 1111 1111 1111 1111 1111",-8則被儲存爲"1111 1111 1111 1111 1111 1111 1111 1000",特別的,32位整形所能表示的最大負數-2147483648則被儲存爲"1000 0000 0000 0000 0000 0000 0000 0000"。

 

計算機在做加法運算時,實際上執行的是補碼的加法運算,在計算的過程中如果數字溢出到不存在的第33位,那麼這個溢出的位就不要了。

 

現在給你一個32位的負整形c。即c∈[−2147483648,−1]c∈[−2147483648,−1]。

請你給我兩個32位的正整形a,b即a,b∈[1,2147483647]a,b∈[1,2147483647]。使得a+b=c。

如果不存在這樣的a和b的話,請輸出一個字符串"No solution"。否則請輸出任意兩個正整形a,b滿足a+b=c。兩個整數之間用一個空格隔開。

輸入描述:

僅一行一個32位負整形c,(−2147483648⩽c⩽−1)(−2147483648⩽c⩽−1)

輸出描述:

如果存在兩個32位正整形a,b使得a+b=c成立,則輸出這兩個正整形。

反之請輸出一個字符串"No solution"。(不含引號)

示例1

輸入

複製

-182

輸出

複製

2147483647 2147483467

說明

a=2147483647="0111 1111 1111 1111 1111 1111 1111 1111"
b=2147483467="0111 1111 1111 1111 1111 1111 0100 1011"
c=-182="1111 1111 1111 1111 1111 1111 0100 1010"
a+b=c
#include<stdio.h>
int c,a,b;
int main(){
    a=0x7fffffff;
    scanf("%d",&c);
    if (c==-1){
        printf("No solution\n");
        return 0;
    }
    b=c-a;
    printf("%d %d\n",a,b);
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章