題目描述
題目背景的問題可以轉化為如下描述:
給定兩個長度分別為 n,m?的整數?a,b,計算它們的和。
但是要注意的是,這里的?a,b?采用了某種特殊的進制表示法。最終的結果也會采用該種表示法。具體而言,從低位往高位數起,第?i?位采用的是?i+1?進制。換言之,相較于十進制下每一位的「逢?10?進?1」,該種進制下第?i位是「逢 i+1?進?1」。
下圖所示,左邊是十進制的豎式加法;右邊是這種特殊進制的豎式加法。圖中的紅色加號表示上一位發生了進位。
輸入格式
- 第一行有兩個整數 n,m,分別表示?a?和?b?的位數。
- 第二行有?n?個整數,中間用空格隔開,從高到低位描述?a?的每個數碼。
- 第三行有?m?個整數,中間用空格隔開,從高到低位描述?b?的每個數碼。
輸出格式
- 輸出有若干個整數,從高到低位輸出 a+b?在這種特殊表示法下的結果。
輸入輸出樣例
輸入 #1
5 4 3 3 2 1 1 3 2 2 1輸出 #1
4 2 1 1 0
輸入 #2
10 1 10 9 8 7 6 5 4 3 2 1 0輸出 #2
10 9 8 7 6 5 4 3 2 1
說明/提示
對于全部數據,保證?1≤n,m≤2×10^5,從低位往高位數起有 ai?∈[0,i],bi?∈[0,i]。請使用 Java 或 Python 語言作答的選手注意輸入輸出時的效率。
import java.util.*;
public class Main{public static void main(String[] args) {Scanner scan = new Scanner(System.in);int n=scan.nextInt();int m=scan.nextInt();int max=Math.max(n, m);int min=Math.min(n, m);int[] a=new int[max+1];int[] b=new int[max+1];int[] ans=new int[max+1];for(int i=(max-n)+1;i<=max;i++) {a[i]=scan.nextInt();}for(int i=(max-m)+1;i<=max;i++) {b[i]=scan.nextInt();}int jinzhi=2;for(int i=max;i>=1;i--) {ans[i]+=a[i]+b[i];if(ans[i]>=jinzhi) {ans[i]-=jinzhi;ans[i-1]+=1;}jinzhi++;}if(ans[0]>0) {System.out.printf(ans[0]+" ");}for(int i=1;i<ans.length;i++) {System.out.printf(ans[i]+" ");}}
}