【ACM-2017四川省赛】A. Simple Arithmetic

7 篇文章 1 订阅

题目描述

Given a and b which both fit in 64-bit signed integers, find ⌊ a/b ⌋ where ⌊x⌋ denotes the largest integer which is not larger than x.

Input

The input contains zero or more test cases and is terminated by end-of-file.
Each test case contains two integers a, b.
• −pow(2,63) ≤ a, b < pow(2,63)
• b != 0
• The number of tests cases does not exceed 104
.
Output

For each case, output an integer which denotes the result.

Sample Input

3 2
3 -2
-9223372036854775808 1
-9223372036854775808 -1

Sample Output

1
-2
-9223372036854775808
9223372036854775808

题目分析

这道题目,一眼望去,连我这个小白都觉得简单,可惜的是总是Runtime Error,看来我是小白是有原因的

题意还是很明了,开门见山的告诉你要做什么,nice

在这里需要明确的几个点:
1、数据范围(这个很重要,我之前一直RE就是这个原因)
2、对于向下取整的理解(正数和负数向下取整的结果分别是什么)
3、符号位如何处理

解题思路

对于题目中给定的范围来说,我们用长整型其实是可以装下的,那么在参数输入的时候就用长整型进行接收,但是注意边界情况,发现边界很大,那么我们在运算的时候直接用有符号的长整型进行运算,必定会存在越界的情况(我一直RE其实就是这种情况,),那么我们可以采用将符号为进行分开处理,这样就可以将有符号的强转为无符号的,这样就不会出现越界的情况了。

AC代码

#include <bits/stdc++.h>
using namespace std;
int main(){
    long long a,b;
    while(cin>>a>>b){
        int fa = -1,fb = -1;
        if(a >= 0){
            fa = 1;
        }
        if(b >= 0){
            fb = 1;
        }
        unsigned long long m = abs(a), n = abs(b), res;
        res = m/n;
        if(fa * fb < 0 && m%n != 0){
            res++;
        }
        if(fa * fb < 0){
            cout<<"-";
        }
        cout<<res<<endl;
    }
    return 0;
}

PS:如有错误之处,欢饮dalao留言指正。如有其他建议也欢迎哟。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值