2021icpc第二場網絡賽M Addition(模擬)


解題思路

  參考了這個博客
  比賽的時候一直在想先把a和b相加之后怎么搞,而沒有想到在a和b相加的過程中怎么搞。用一個變量存儲進位,然后分幾種情況討論。
  如果兩位加起來加上進位結果是0和1,不用進位。
  如果結果是2,那么需要進位,並且這一位結果是0。如果本位的sgn為正,那么如果下一位的sgn也是正,那么就進1,如果是負呢,如果下一位大於1,就減1,否則的話就往后借位。如果本位sgn為負,那么如果下一位也是負,同上,否則也需要減1和借位。
  如果是3,和上面類似,只是這一位結果是1。
  如果是-1,表示這一位的數字不夠了,需要往后借一個與自己符號相反的位,並且這一位得是1,因為后面的數是當前數的二倍。

代碼

const int maxn = 1e2+10;
int t[maxn], a[maxn], b[maxn], c[maxn];
int main() {
    IOS;
    int n; cin >> n;
    for (int i = 1; i<=n; ++i) cin >> t[i];
    for (int i = 1; i<=n; ++i) cin >> a[i];
    for (int i = 1; i<=n; ++i) cin >> b[i];
    int p = 0;
    for (int i = 1; i<=n; ++i) {
        p *= t[i];
        int sum = a[i]+b[i]+p;
        if (sum<=1) {
            c[i] = 0;
            p = 0;
        }
        else if (p==2) {
            c[i] = 0;
            p = 1;
        }
        else if (p==3) {
            c[i] = 1;
            p = 1;
        }
        else if (p==-1) {
            c[i] = 1;
            p = -1;
        }
        p *= t[i];
    }
    for (int i = 1; i<=n; ++i) cout << c[i] << (i==n ? "":"\n");
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM