第四届传智杯初赛(莲子的机械动力学)

2023-12-13 13:00:14

题目描述

题目背景的问题可以转化为如下描述:

给定两个长度分别为 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]+" ");
	        }
	   }
}

文章来源:https://blog.csdn.net/s44Sc21/article/details/134835804
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。