鏈接: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;
}