小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;
}

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aurora_U

谢谢你的鼓励,我会继续努力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值