列表

详情


NC25085. 小w的a+b问题

描述

大家一定都做过各大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。即

请你给我两个32位的正整形a,b即。使得a+b=c。

如果不存在这样的a和b的话,请输出一个字符串"No solution"。否则请输出任意两个正整形a,b满足a+b=c。两个整数之间用一个空格隔开。

输入描述

仅一行一个32位负整形c,

输出描述

如果存在两个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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 376K, 提交时间: 2020-08-12 10:56:21

#include<cstdio>
int n;
int main()
{
    scanf("%d",&n);
	if(n==-1) puts("No solution");
	else printf("2147483647 %d\n",n-2147483647);
}

C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 612K, 提交时间: 2020-02-26 15:20:55

#include<cstdio>
int main()
{
	int n;
	scanf("%d",&n);
	if(n==-1) puts("No solution");
	else printf("2147483647 %d\n",n-2147483647);
}

C(clang 3.9) 解法, 执行用时: 2ms, 内存消耗: 376K, 提交时间: 2019-06-21 22:26:02

#include"stdio.h"
main(){
	int c;
	scanf("%d",&c);
	if(c==-1)
	printf("No solution");
	else
	printf("2147483647 %d",2147483649+c);
}

Python3(3.5.2) 解法, 执行用时: 28ms, 内存消耗: 3348K, 提交时间: 2019-10-27 14:55:53

xxx = input()
if int(xxx) == -1:
    print("No solution")
else:
    print(2147483647,2147483647+int(xxx)+2)

上一题