Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Apr 15th, 2012  |  syntax: Java  |  size: 6.01 KB  |  hits: 21  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. import java.io.*; // 입력을 받기 위해 이 라이브러리가 필요하다.
  2. import java.util.*;
  3.  
  4. public class BigInteger
  5. {
  6.         private String data;
  7.         private char[] input1;
  8.         private char[] input2;
  9.         private int sign1=0, sign2=0, operand=0; // +는 0, -는 1, *는 2(operand만)
  10.         private int ressign = 0;                                // 최종 결과의 부호, +는 0, -는 1
  11.        
  12.         BigInteger(String input){
  13.                 data = input;
  14.         }
  15.         private void parse(){
  16.         // 문자열 처리에 관련된 모든 일을 담당하는 method
  17.                 StringTokenizer stk = new StringTokenizer(data, "+-* ");
  18.                 input1 = (stk.nextToken()).toCharArray();       // 숫자 1
  19.                 input2 = (stk.nextToken()).toCharArray();       // 숫자 2
  20.  
  21.                 String noBlank = data.replace(" ", "");         // 공백을 모두 없앰
  22.                 char[] tmp = noBlank.toCharArray();
  23.                 if(tmp[0]=='-') sign1 = 1;                                     
  24.                 else sign1=0;
  25.                
  26.                 for(int i=1; i<tmp.length; i++){                       
  27.                         if(tmp[i]>='0' && tmp[i]<='9' ) continue;
  28.                         if(tmp[i]=='+'){
  29.                                 operand = 0;
  30.                         }
  31.                         else if(tmp[i]=='-'){
  32.                                 operand = 1;
  33.                         }
  34.                         else if(tmp[i]=='*'){
  35.                                 operand = 2;
  36.                         }
  37.                         if(tmp[i+1]=='-'){
  38.                                 sign2 = 1;
  39.                                 break;
  40.                         }
  41.                         else{
  42.                                 sign2 = 0;
  43.                                 break;
  44.                         }
  45.                 }
  46.         }
  47.         private void calculate()
  48.         {
  49.                 char[] result={0};
  50.                 if(operand==0){
  51.                         if(sign1==0 && sign2 ==1){
  52.                                 result = sub(input1, input2);
  53.                         }
  54.                         else if(sign1==1 && sign2==1){
  55.                                 ressign = 1;
  56.                                 result = add(input1, input2);
  57.                         }
  58.                         else if(sign1==1 && sign2==0){
  59.                                 result = sub(input2, input1);
  60.                         }
  61.                         else result = add(input1, input2);
  62.                 }
  63.                 else if(operand==1){
  64.                         if(sign1==0 && sign2 ==0){
  65.                                 result = sub(input1, input2);
  66.                         }
  67.                         else if(sign1==1 && sign2==0){
  68.                                 ressign = 1;
  69.                                 result = add(input1, input2);
  70.                         }
  71.                         else if(sign1==0 && sign2 ==1){
  72.                                 result = add(input1, input2);
  73.                         }
  74.                         else result = sub(input2, input1);
  75.                 }
  76.                 else if(operand==2){
  77.                         if((sign1==0 && sign2==1) || (sign1==1 && sign2==0)){
  78.                                 ressign = 1;
  79.                         }
  80.                         result = mult(input1, input2);
  81.                 }
  82.                
  83.                 if(ressign==1 && result[0]!='0') System.out.print('-');
  84.                 System.out.println(result);
  85.         }
  86.         private char[] reverse(char[] input){
  87.                 char[] res = new char[input.length];
  88.                 for(int i=input.length-1; i>=0; --i){
  89.                         res[input.length-1-i] = input[i];
  90.                 }
  91.                 return res;
  92.         }
  93.         private char[] add(char[] in1, char[] in2){
  94.                 if(in1.length<in2.length){
  95.                         return add(in2, in1);
  96.                 }      
  97.                 char[] res=new char[202];
  98.                 for(int i=0; i<200; i++) res[i]='0';
  99.                 char[] rev1 = reverse(in1);
  100.                 char[] rev2 = reverse(in2);
  101.                 for(int i=0; i<rev2.length; i++){
  102.                         res[i] = (char) (res[i]+rev1[i]+rev2[i]-'0'-'0');
  103.                         if(res[i]>'9'){
  104.                                 res[i+1]+= 1;
  105.                                 res[i]-=10;
  106.                         }
  107.                 }
  108.                 for(int i=rev2.length; i<rev1.length; i++){
  109.                         res[i] = (char) (res[i]+rev1[i]-'0');
  110.                         if(res[i]>'9'){
  111.                                 res[i+1]+= 1;
  112.                                 res[i]-=10;
  113.                         }
  114.                 }
  115.                 if(res[in1.length]==1) res[in1.length] = '1';
  116.                 for(int i=200; i>=1; i--){
  117.                         if(((res[i]=='\0') || (res[i]=='0')) && ((res[i+1]=='\0') || (res[i+1]=='0'))) res[i]='\0';
  118.                         else break;
  119.                 }
  120.                
  121.                 String str = new String(reverse(res));
  122.                 str = str.replace("\0", "");
  123.                 return str.toCharArray();
  124.         }
  125.         private char[] sub(char[] in1, char[] in2){
  126.                 if(in1.length<in2.length){
  127.                         if(ressign==1) ressign = 0;
  128.                         else ressign = 1;
  129.                         return sub(in2, in1);
  130.                 }
  131.                
  132.                 int carry=0;
  133.                 char[] res = new char[101];
  134.                 char[] rev1 = reverse(in1);
  135.                 char[] rev2 = reverse(in2);
  136.                 for(int i=0; i<rev2.length; i++){
  137.                         res[i] = (char) (carry+rev1[i]-rev2[i]+'0');
  138.                         if(res[i]<'0'){
  139.                                 carry= -1;
  140.                                 res[i]+=10;
  141.                         }
  142.                         else carry=0;
  143.                 }
  144.                 for(int i=rev2.length; i<rev1.length; i++){
  145.                         res[i] = (char) (carry+rev1[i]);
  146.                         if(res[i]<'0'){
  147.                                 carry = -1;
  148.                                 res[i]+=10;
  149.                         }
  150.                         else carry=0;
  151.                 }
  152.                 for(int i=rev1.length-1; i>=1; i--){
  153.                         if(res[i]=='0') res[i]='\0';
  154.                         else break;
  155.                 }
  156.                
  157.                 String str = new String(reverse(res));
  158.                 str = str.replace("\0", "");
  159.                 if(carry==-1){
  160.                         char[] before = str.toCharArray();
  161.                         char[] onemore = new char[before.length+1];
  162.                         onemore[0]='1';
  163.                         for(int i=1; i<onemore.length; i++){
  164.                                 onemore[i]='0';
  165.                         }
  166.                         if(ressign==1) ressign=0;
  167.                         else ressign=1;
  168.                         return sub(onemore, before);
  169.                 }
  170.                 return str.toCharArray();
  171.         }
  172.         private char[] mult(char[] in1, char[] in2){
  173.                 if(in1.length<in2.length){
  174.                         return mult(in2, in1);
  175.                 }
  176.                 int psum;
  177.                 int carry;
  178.                
  179.                 char[] res = new char[200];
  180.                 for(int i=0; i<200; i++) res[i]='0';
  181.                 char[] rev1 = reverse(in1);
  182.                 char[] rev2 = reverse(in2);
  183.                 for(int i=0; i<rev2.length; i++){
  184.                         char[] tmp2 = new char[200];
  185.                         for(int k=0; k<200; k++) tmp2[k]='0';
  186.                         for(int j=0; j<rev1.length; j++){
  187.                                 psum = (rev1[j]-'0')*(rev2[i]-'0');
  188.                                 carry = psum/10;
  189.                                 tmp2[i+j]+=(psum%10);
  190.                                 if(tmp2[i+j]>'9'){
  191.                                         tmp2[i+j]-=10;
  192.                                         carry++;
  193.                                 }
  194.                                 tmp2[i+j+1]+=carry;
  195.                         }
  196.                         res = add(res, reverse(tmp2));
  197.                 }
  198.                
  199.                 String str = new String(res);
  200.                 str = str.replace("\0", "");
  201.                 return str.toCharArray();
  202.         }
  203.        
  204.         public static void main(String args[])
  205.         {
  206.                 // 입력을 받기 위한 작업이다.
  207.                 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  208.                
  209.                 // quit가 나올 때 까지 입력을 받아야 하므로
  210.                 // while(true) 문을 사용하여 계속 반복한다.
  211.                 while (true)
  212.                 {
  213.                         try   // try 와 catch 문은 오류 발생을 감지한다.
  214.                         {
  215.                                 String input = br.readLine();   // 한 줄을 입력 받아 input 문자열에 저장
  216.  
  217.                                 if (input.compareTo("quit") == 0)
  218.                                 {
  219.                                         // quit 라고 입력받았을 경우 종료한다.
  220.                                         // 종료하려면 while 문을 빠져나와야 하므로 break를 사용한다.
  221.                                         break;
  222.                                 }
  223.  
  224.                                 // quit가 아니라면 식을 계산해야 한다.
  225.                                 BigInteger BI = new BigInteger(input);
  226.                                 BI.parse();
  227.                                 BI.calculate();
  228.                         }
  229.                         catch (Exception e)
  230.                         {
  231.                                 // 만약 try { } 안에서 오류가 발생했다면 이곳으로 오게 된다.
  232.                                 // 이렇게 함으로써 입력을 이상하게 했을 경우 발생하는 오류를 방지한다.
  233.                                 System.out.println("입력이 잘못되었습니다. 오류 : " + e.toString());
  234.                         }
  235.                 }
  236.         }
  237. }