日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

PAT 1065 A+B and C[大数运算][溢出]

發(fā)布時(shí)間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PAT 1065 A+B and C[大数运算][溢出] 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1065?A+B and C (64bit)(20?分)

Given three integers?A,?B?and?C?in [?2?63??,2?63??], you are supposed to tell whether?A+B>C.

Input Specification:

The first line of the input gives the positive number of test cases,?T?(10). Then?T?test cases follow, each consists of a single line containing three integers?A,?B?and?C, separated by single spaces.

Output Specification:

For each test case, output in one line?Case #X: true?if?A+B>C, or?Case #X: false?otherwise, where?X?is the case number (starting from 1).

Sample Input:

3 1 2 3 2 3 4 9223372036854775807 -9223372036854775808 0

Sample Output:

Case #1: false Case #2: true Case #3: false

?題目大意:給出三個(gè)數(shù),判斷前兩個(gè)數(shù)的和是否>第三個(gè)數(shù),數(shù)是非常大的,需要用字符串來(lái)處理的。

?//這里需要認(rèn)真學(xué)習(xí)大數(shù)加法與大數(shù)乘法的套路。

//看了題解之后,才發(fā)現(xiàn)根本不是,long long就是2^64!!!

//這個(gè)為溢出問(wèn)題,

代碼來(lái)自:https://www.liuchuo.net/archives/2023

#include <cstdio> using namespace std; int main() {int n;scanf("%d", &n);for(int i = 0; i < n; i++) {long long a, b, c;scanf("%lld %lld %lld", &a, &b, &c);long long sum = a + b;if(a > 0 && b > 0 && sum < 0) {//此時(shí)產(chǎn)生溢出,A+B>Cprintf("Case #%d: true\n", i + 1);} else if(a < 0 && b < 0 && sum >= 0){//產(chǎn)生溢出,說(shuō)明64位表示不了這么小的數(shù),printf("Case #%d: false\n", i + 1);//那么一定是小于。} else if(sum > c) {//其他為正常情況printf("Case #%d: true\n", i + 1);} else {printf("Case #%d: false\n", i + 1);}}return 0; }

?

//我發(fā)現(xiàn)我很不理解,這個(gè)表示范圍的問(wèn)題,所以學(xué)習(xí)了一下:https://blog.csdn.net/y12345678904/article/details/52854230#commentBox

對(duì)于int 來(lái)說(shuō),4個(gè)字節(jié),32位,有一位是符號(hào)為,那么它表示的數(shù)的范圍就是(-2^31,2^31-1)。

右邊的很好理解,比如4位,除去一位符號(hào)位,最大正數(shù)能表示7,(2^3-1).

那么對(duì)于最小數(shù)呢?由于負(fù)數(shù)在計(jì)算機(jī)中是用補(bǔ)碼(原碼取反+1)來(lái)存的,

-1的原碼:1000 0000 0000 0000 0000 0000 0000 0001;

-1的補(bǔ)碼:1111 1111 1111 1111 1111 1111 1111 1111;

-2147483647(-2^31+1)原碼:1111 1111 1111 1111 1111 1111 1111 1111;

-2147483647補(bǔ)碼:1000 0000 0000 0000 0000 0000 0000 0001;

但是!零有二進(jìn)制中+0和-0兩種形式:

+0原碼為:0000 0000 0000 0000 0000 0000 0000 0000;

-0原碼為:1000 0000 0000 0000 0000 0000 0000 0000;

那么就將-0拿來(lái)作為了-2^31,所以就是這么來(lái)的!

-2147483648的補(bǔ)碼表示為1000 0000 0000 0000 0000 0000 0000 0000,在32位沒(méi)有原碼。

注意,這個(gè)補(bǔ)碼并不是真正的補(bǔ)碼,真正的補(bǔ)碼(原碼也是這個(gè))是1 1000 0000 0000 0000 0000 0000 0000 0000,溢出(已經(jīng)多了一位1,!不是32位能表示的了!)。

溢出情況:https://blog.csdn.net/diffjd/article/details/72835698

比如1字節(jié)為例:

正數(shù)區(qū)間:0000 0001 ~ 0111 1111? (1~127)

負(fù)數(shù)區(qū)間:1000 0000 ~ 1111 1111(-1~-127)

并且規(guī)定將-0表示為-128,那么如果最大整數(shù)超過(guò)產(chǎn)生溢出怎么辦?

寫(xiě)了一個(gè):

對(duì)圖中a的二進(jìn)制:0111 1111 1111 1111,此時(shí)再加就會(huì)超出界限,1000 0000 0000 0000,此時(shí)就是溢出了,就變?yōu)榱素?fù)數(shù),

此時(shí):-32768在計(jì)算機(jī)中的表示就是-0,也就是1000 0000 0000 0000,那么在此基礎(chǔ)上再做++運(yùn)算,在計(jì)算機(jī)中補(bǔ)碼是直接進(jìn)行加法運(yùn)算的

結(jié)果就是1000 0000 0000 0001(對(duì)應(yīng)的原碼是:1111 1111 1111 1111),對(duì)應(yīng)的十進(jìn)制就是-32767.

?終于搞明白了!

如圖中的最后一行三個(gè)數(shù):

其中2表示-32767中有兩個(gè)1,包括符號(hào)位1和最后一位1;

其中1表示-32768中有一個(gè)1,即符號(hào)為的1;

其中16表示-1中有16個(gè)1,全為1.

這個(gè)運(yùn)行結(jié)果再一次的證明了,會(huì)變成整數(shù),是直接進(jìn)行補(bǔ)碼運(yùn)算的。

//終于搞明白了!?

轉(zhuǎn)載于:https://www.cnblogs.com/BlueBlueSea/p/9531764.html

總結(jié)

以上是生活随笔為你收集整理的PAT 1065 A+B and C[大数运算][溢出]的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。