相反數問題

2021-08-08 00:01:32 字數 1599 閱讀 4567

或許你已經知道了問題的描述,不過這裡再重複一遍,因為很羞赧的說:「這個問題,我栽了個大跟頭!」(盡情嘲笑我吧!/(ㄒoㄒ)/~~)

乙個整數1234與它倒序數4321和稱之為相反數。現在的問題要求是:從控制台輸入乙個整數n (1 ≤ n ≤ 10 ^ 5),輸出它的相反數。如1234,就輸出1234 + 4321 = 5555。

既然待處理的值是乙個整數,乙個簡單的想法是把輸入的數用乙個long來儲存(64位系統,int是4個位元組,是可以代表以上整數範圍的,但考慮到32位系統,就使用長整型吧。)。再用乙個long來表達最終的結果值result,在輸入n後就把它加入到result中。現在result與最後的正確結果就缺少它的倒序數了。

因為我們不知道最終輸入的n總共有幾位,所以如果要取出n的每一位,就不得不讓其依次除以100000、10000、1000、100、10。然後乘以最終的除數,並乘以分別的倍數1、10、100、1000、10000、100000。然後你就會發現,這個決定有乙個bug,如果不是6位的數字,在進行10000、100000的倍乘時,會出現問題。所以要讓這個方法可行的話,還要判斷當前輸入數字的位數。但是問題的本身真的有這麼複雜嗎?

重新審一下題,輸入元是乙個知道大小範圍的整數,確切來說是知道位數的整數。這給我們透露了什麼樣的資訊了?是的,使用字串處理。因為從控制台輸入的內容本質上都是字串型別,然後在執行時,系統會自動匹配對應型別,比如將它作為int或者string儲存。使用字串帶來的好處是問題的解決過程就是字串的倒序和順序的字元和,再將其轉換成數字即可。乙個簡單的實現可以兌現為:

#include 

using

namespace

std;

int main()

cout

<< endl;

return

0;}

演算法的實現過程其實很簡單,就是利用字元的ascii碼的差值來實現字元的相加。在oc中我們有現成的api可以完成字串轉成int,而其實它的底層實現或許就是通過這樣的乙個方式來轉換的。真是高階的api用多了,最基本的線性過程工作流竟都有點忘卻了,這裡記錄一筆:好好自省。演算法和資料結構方面需要惡補,這種小白菜級別的問題都掉入了坑里,真是讓人覺得汗顏!

面壁思過一百天中……

上述例程沒有考慮到進製問題,在牛客網上只能通過40%的測試用例,以下是它的修訂版本:

#include 

#include

using

namespace

std;

int main() else

}int count = int(result.size());

for (int i = 0; i < count; i ++)

cout

<< endl;

return

0;}

CCF之相反數

問題描述 試題編號 201403 1 試題名稱 相反數時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 有 n 個非零且各不相同的整數。請你編乙個程式求出它們中有多少對相反數 a 和 a 為一對相反數 輸入格式 第一行包含乙個正整數 n。1 n 500 第二行為 n 個用單個空格隔...

EOF女神的相反數

description 作為女神,eof是很喜歡照鏡子的 同樣在數學中,eof也是很喜歡相反數的。不過她既然是女神,她認知的相反數和我們凡人怎麼能一樣呢?給定乙個十進位制數a,eof女神定義的相反數就是把這個數轉化為二進位制之後,忽略高位的0,然後作軸對稱,例如對於十進位制的數123 1111011...

位運算求相反數

n的相反數等於 n 1 對於取相反數之後不會產生溢位的情況都適用 對於正數的相反相反數來說,原碼就是除符號位變為1,其他不變,計算機中 對於乙個數字來說儲存的都是其補碼,負數的補碼為符號位不變其他位按位取反,然後將得到的結果 1 而 n 1的過程第一步就是將符號為變為1,變為其相反數原碼的情況,然後...