`
endual
  • 浏览: 3560972 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ACM 1000

    博客分类:
  • ACM
 
阅读更多

 

A + B Problem

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 197537    Accepted Submission(s): 59076


Problem Description
Calculate A + B.
 

Input
Each line will contain two integers A and B. Process to end of file.
 

Output
For each case, output A + B in one line.
 

Sample Input
1 1
 

Sample Output
2
 

Author
HDOJ
 

 

 

   分析:这个题目我是这样想的,模拟人的做法,用到了栈的。解答的思路在代码中有标示

 

(JAVA 中有超大数的类可以实现)

 

     import java.math.BigDecimal;

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {

		String num1, num2;
		BigDecimal big1, big2;
		Scanner in = new Scanner(System.in);
		while (in.hasNextInt()) {
			num1 = in.next();
			num2 = in.next();
			big1 = new BigDecimal(num1);
			big2 = new BigDecimal(num2);

			System.out.println(big1.add(big2));
		}
	}
}
 

 

 

 

 

先留着
package endual.answer;

import java.util.Scanner;
import java.util.Stack;

public class Main {
	
	public static void main(String[] args) {
		
		Scanner cin = new Scanner(System.in);
		String a, b;
		a = cin.next();
		b = cin.next();
		
		char f1 = a.charAt(0) ; //保存a的符号
		char f2 = b.charAt(0) ; //保存b的符号
		int fSum = 0 ;
		if (f1 == '-') {
			a = a.substring(1) ;
			fSum++ ;
		}
		if (f2 == '-') {
			b = b.substring(1) ;
			fSum++ ;
		}
		
		int aLen = a.length() ;
		int bLen = b.length() ;
		if (aLen < bLen) { //保证a的长度要大于b的长度
			String tempBtoA = a ;
			a = b ;
			b = tempBtoA ;
			char tempF = f1 ; //同样交换他们的符号
			f1 = f2 ;
			f2 = tempF ;
		} //保证a的长度要大于等于b的长度
		
		//如果是同号的
		if(fSum != 1) {
			
			String res = jia(a,b) ;
			if(fSum == 2) {
				res = "-" + res ;
			}
			System.out.println(res) ;
			return ;
		}
		
		
		//如果是不同号的
		String tempa = a ;
		String tempb = b ;
		//如果是相等的 那么返回0
		if(a.equals(b)) {
			System.out.println(0) ;
			return ;
		}
		
		String c ;
		boolean isBigger = getWhoIsGiger(tempa,tempb) ; //返回a和b那个大了
		System.out.println(isBigger) ;

		if (!isBigger) { //b 大
			
		    c = jian(b,a) ;
			if(f2 == '-') {
				c = "-" + c ;
			}
		} else { //a大
			
			 c = jianab(a,b) ;
			 if(f1 == '-') {
				 c = "-" + c ;
				 
			 }
		}
		
		System.out.println(c) ;
		
	} //end main

	private static String jianab(String a, String b) {
		Stack stacka = new Stack();
		Stack stackb = new Stack();
		String ab = a;
		while (ab.length() != 0) {
			
			char c = ab.charAt(0);
			String subab = ab.substring(1);
			stacka.push(c) ;
			ab = subab ;
		}
		
		String abc = b;
		while (abc.length() != 0) {
			
			char c = abc.charAt(0);
			String subabc = abc.substring(1);
			stackb.push(c) ;
			abc = subabc ;
		}

		Stack sum = new Stack();
		int temp = 0;
		int t = 0;
		while (!stackb.isEmpty()) { // 如果两个里面其中有一个是空了,那么停止

			int aInt = Integer.parseInt(stacka.pop().toString());
			int bInt = Integer.parseInt(stackb.pop().toString());
			temp = aInt - bInt + t + 10;
			if (temp < 10) {
				t = -1;
			} else {
				temp = temp - 10 ;
				t = 0; // 将t设置成为1,此时将sumAB的1取得
			}
			sum.push(temp); // 添加到栈中去
		}// end while ;

		while(!stacka.isEmpty()) {
			
			int aInt = Integer.parseInt(stacka.pop().toString());
			temp = aInt + t;
			if (temp < 10) {
				t = 0;
			} else {
				temp = temp - 10 ;
				t = 1; // 将t设置成为1,此时将sumAB的1取得
			}
			sum.push(temp); // 添加到栈中去
			
		}
		
	String s = "" ;
	while (!sum.isEmpty()) { // 如果两个里面其中有一个是空了,那么停止

		s = s+sum.pop().toString();
		
	}
	return s ;
		
	}

	//不同号码相减
	private static String jian(String a, String b) {
		
		Stack stacka = new Stack();
		Stack stackb = new Stack();
		String ab = a;
		System.out.println("-----a------ |-" +ab);
		while (ab.length() != 0) {
			
			char c = ab.charAt(0);
			String subab = ab.substring(1);
			stacka.push(c) ;
			ab = subab ;
		}
		
		String abc = b;
		System.out.println("-----b------|-" +abc);
		while (abc.length() != 0) {
			
			char c = abc.charAt(0);
			String subabc = abc.substring(1);
			stackb.push(c) ;
			abc = subabc ;
		}

		Stack sum = new Stack();
		int temp = 0;
		int t = 0;
		while (!stackb.isEmpty()) { // 如果两个里面其中有一个是空了,那么停止

			int aInt = Integer.parseInt(stacka.pop().toString());
			int bInt = Integer.parseInt(stackb.pop().toString());
			temp = aInt - bInt + t + 10;
			if (temp < 10) {
				t = -1;
			} else {
				temp = temp - 10 ;
				t = 0; // 将t设置成为1,此时将sumAB的1取得
			}
			sum.push(temp); // 添加到栈中去
		}// end while ;

	String s = "" ;
	while (!sum.isEmpty()) { // 如果两个里面其中有一个是空了,那么停止

		s = s+sum.pop().toString();
		
	}
	return s ;
	}

//同号相加
	private static String jia(String a, String b) {
		
		Stack stacka = new Stack();
		Stack stackb = new Stack();
		String ab = a;
		while (ab.length() != 0) {
			
			char c = ab.charAt(0);
			String subab = ab.substring(1);
			stacka.push(c) ;
			ab = subab ;
		}
		
		String abc = b;
		while (abc.length() != 0) {
			
			char c = abc.charAt(0);
			String subabc = abc.substring(1);
			stackb.push(c) ;
			abc = subabc ;
		}

		Stack sum = new Stack();
		int temp = 0;
		int t = 0;
		while (!stackb.isEmpty()) { // 如果两个里面其中有一个是空了,那么停止

			int aInt = Integer.parseInt(stacka.pop().toString());
			int bInt = Integer.parseInt(stackb.pop().toString());
			temp = aInt + bInt + t;
			if (temp < 10) {
				t = 0;
			} else {
				temp = temp - 10 ;
				t = 1; // 将t设置成为1,此时将sumAB的1取得
			}
			sum.push(temp); // 添加到栈中去
		}// end while ;

	while(!stacka.isEmpty()) {
		
		int aInt = Integer.parseInt(stacka.pop().toString());
		temp = aInt + t;
		if (temp < 10) {
			sum.push(temp);
			t = 0;
		} else {

			temp = temp - 10 ;
			t = 1; // 将t设置成为1,此时将sumAB的1取得
		}
		sum.push(temp); // 添加到栈中去
		
	}
	if(t==1) {
		
		sum.push(t) ;
	}
	String s = "" ;
	while (!sum.isEmpty()) { // 如果两个里面其中有一个是空了,那么停止

		s = s+sum.pop().toString();
		
	}
	return s ;
		
	}


	private static boolean getWhoIsGiger(String a, String b) {
		
		if (a.length() > b.length()) {
			 return true ;
		 }
		//a的长度等于b的长度
		 boolean sig = true ;
		 boolean isBiger = true ; // 默认a > b
		 while (b.length() != 0) { //因为b的长度小,所以它先没有
			
			int intB = Integer.parseInt(b.charAt(0)+"") ;
			b = b.substring(1) ;
			int intA = Integer.parseInt(a.charAt(0)+"") ;
			a = a.substring(1) ;
			if(sig) {
				if(intA < intB) { //高位上比较 b要大于a了
					isBiger = false ;
					sig = false ;
				}
			}
		}
		 
		return isBiger;
	}
	
} //end class
  

网上的代码是要计算a 和 b的长度,我在想,要是a和b的长度超过了int类型的长度,那么不是不能用了。所以用栈,这么就不用考虑a 和 b的长度了

代码还有问题的
哎 这个ACM还是有的难的
分享到:
评论

相关推荐

    PKU acm 1000题-2000题

    【标题】"PKU acm 1000题-2000题" 涉及的是北京大学(PKU)ACM/ICPC(国际大学生程序设计竞赛)训练题目的一部分,这个范围涵盖了从1000题到2000题的解题源代码。在ACM/ICPC中,参赛队伍需要编写程序解决一系列算法...

    杭电acm 1000-2099

    【杭电ACM 1000-2099】是杭州电子科技大学(Hangzhou Dianzi University,简称“杭电”)ACM/ICPC(国际大学生程序设计竞赛)训练平台上的一个问题集,涵盖了从1000到2099编号的编程题目。这些题目旨在锻炼和提升...

    杭电ACM1000-1099题目代码

    《杭电ACM1000-1099题目代码解析及学习指南》 杭州电子科技大学(简称“杭电”)的ACM竞赛题目在编程爱好者中具有很高的知名度,其涵盖的问题范围广泛,难度适中,是提高编程技能、理解和运用算法的良好平台。这个...

    北大 ACM 1000 题 本人自创 适合绝对新手 学过C的就无视吧

    北大ACM 1000题指的是北京大学计算机科学系设立的一系列算法竞赛题目集合,它属于ACM(Association for Computing Machinery)国际大学生程序设计竞赛的一部分。ACM竞赛是全球范围内最具影响力的大学生计算机编程...

    清华acm 1000-1020

    【标题】"清华acm 1000-1020" 涉及的知识点主要集中在算法竞赛,特别是编程挑战的范畴。这通常指的是清华大学主办的ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest)训练题目,编号从...

    Ural ACM 1000源代码(c++)

    【Ural ACM 1000源代码(c++)】是一个编程竞赛相关的项目,其中包含了使用C++语言编写的源代码,这些代码是为了解决特定的算法问题而设计的。Ural ACM通常指的是乌拉尔大学(University of Ural)举办的算法竞赛,这...

    杭电ACM1000题

    杭电acm1000,很小,很简单的源代码,真的不错……

    杭电acm 1000

    #include using namespace std; int main() { int a,b; while(cin&gt;&gt;a&gt;&gt;b) cout; return 0; }

    北大ACM1000-1008(九道题)

    这些题目来自于北京大学ACM在线评测系统的1000到1008号题目,这是一个针对算法和编程能力的训练集。ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest)是全球范围内的一个权威性编程竞赛...

    杭电ACM答案(1000到1099)

    【杭电ACM答案(1000到1099)】这个压缩包文件主要包含的是杭州电子科技大学(简称杭电)ACM国际大学生程序设计竞赛(ICPC)的练习题答案。ACM竞赛是全球范围内极具影响力的编程比赛,旨在提升大学生的算法设计、...

    杭电 acm 1000

    杭电acm上的第一道题目,虽然很简单,可还是有人栽进去,就拿来分享一下

    杭电oj1000题解题报告

    杭电oj1000题解题报告

    杭电ACM 1000

    我是个初学者,自己做的。希望对后来的初学者有帮助

    杭电1000到1050 acm解题报告

    在本压缩包中,我们看到的是与杭电(杭州电子科技大学)ACM竞赛相关的解题报告,主要涵盖了1000至1050编号范围内的题目。这些题目是编程竞赛的一部分,通常涉及算法设计、数据结构和问题解决技巧。在ACM(国际大学生...

    杭电ACM答案 1000-1099

    【杭电ACM答案 1000-1099】是一份珍贵的资源,主要针对参与杭州电子科技大学(Hangzhou Dianzi University,简称杭电)ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest,ICPC)训练的...

    杭电ACM离线题库(1000-4955)

    杭电ACM离线题库(1000-4955)

    浙江大学ACM部分答案

    代码中使用了`ifstream`来读取数据文件“1000.txt”,然后进行简单的加法运算。这体现了: - **输入输出流**:利用`ifstream`和`ofstream`进行文件的读写操作。 - **循环结构**:通过`for`循环处理每一组输入数据,...

    杭电ACM答案(1000-1099)

    【杭电ACM答案(1000-1099)】是一个针对杭州电子科技大学(Hangzhou Dianzi University,简称“杭电”)ACM/ICPC竞赛训练题目的资源集合,其中包含了从1000到1099编号的题目解答。这个压缩包是编程爱好者和参赛者...

    北大ACM题库(3000多道题)

    在ACM竞赛中,能够完成1000道以上题目的选手通常被认为具有非常高的算法水平和问题解决能力。这是因为每道题目背后都涉及到不同的知识领域和思维模式,解决这些问题需要深厚的理论基础、丰富的实践经验以及良好的...

Global site tag (gtag.js) - Google Analytics