我目前正在練習演算法和 DS。我偶然發現了一個我不知道如何解決的問題。所以問題的鏈接在那里:
綜上所述,它表示一個圓圈中有幾把椅子,以及人的位置(相對于某把椅子),以及他應該做多少 M 動作。
所以輸入如下:
3個整數 N, M, X , 椅子的數量, 男孩應該移動的次數和他將從第一把椅子開始 ( 1 ≤ X ≤ N < 2^63 , 0 ≤ M < 2^63 )
那么,到目前為止我做了什么?我想到了以下幾點:
所以我認為M移動后的相對位置是(x m)%n,因為這會導致Integer溢位,所以我是這樣做的,((x%n) (m%n))%n。我發現如果這個人已經到達椅子的最后一個索引,它將是 0,所以我處理了這個。但是,它僅通過了 2 個測驗。我不需要撰寫任何代碼,我想以正確的思維方式進行指導。到目前為止,這是我的代碼:
#include <iostream>
using namespace std;
int main() {
long long n, m, x;
cin >> n >> m >> x;
// After each move, he reaches (X 1).
// X, N chairs.
// ((X % N) (M % N)) % N;
// Odd conideration.
if ( m % 2 == 1) {
m = 1;
}
long long position = (x % n m % n) % n;
if (position == 0) {
position = n;
}
cout << position;
return 0;
}
uj5u.com熱心網友回復:
這是問題所在:
假設 N 的值是 2^63-1,而 X 和 M 都是 2^63-2。
當您的程式運行到((X % N) (M % N)) % N零件時,
X%N計算為 2^63 - 2(未更改),M%N. 然后,兩個結果之間的加法發生了:2^63 - 2 2^63 - 2,發生了溢位。
uj5u.com熱心網友回復:
如果問題需要特定的錯誤處理,它應該已經說明(所以不要感覺不好)。
在每個現實世界的專案中,都應該有一個標準來規定如何處理奇怪的輸入。你扔嗎?你輸出警告嗎?如果是這樣,是否必須將其翻譯成系統語言?
如果沒有這樣的說明,我會在閱讀這些值后錯誤地排除它們。向 std::cerr 列印錯誤(或拋出例外)。在盡可能靠近您閱讀它們的地方執行此操作。
對于溢位檢測,您可以使用此處描述的方法。有些人可能不同意,對于實驗室練習,這可能并不重要。然而,在計算中有個說法是“Garbage in == Garbage out”。在處理之前檢查垃圾是一個好習慣,而不是在處理時嘗試“回收”垃圾。
uj5u.com熱心網友回復:
在@WBuck 的評論之后,答案實際上相當簡單,就是將 long long 更改為 unsigned,因為沒有負數,因此,增加 long long 的 MAX VALUE(使用 unsigned 時)。
非常感謝。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/351311.html
上一篇:C中位運算的模運算
