工作都使用c# 複習一下Jave 選擇了題目 

大數運算:利用字串處理,可以解決正整數500位數之間 相加減乘除的問題

心得:演算法花了些時間,部分最佳化,耗時約 2 hours,小卡了幾個地方

1. Java使用強型別 轉換時比C#多限制也造成了重覆的程式碼。

2. 除式演算法仍採用類似直式除法,當相減的運算多了,效率不彰

結論:仍有改進空間。 

程式碼如下:

import java.util.Scanner;
import java.io.*;
public class java {
     public static void main(String[] args) {
          Scanner cin = new Scanner(System.in);
          String s;
          while (cin.hasNext()) {
                s=cin.nextLine();
                String[] temp=s.split(" ");
                int len1=temp[0].length();
                int len2=temp[2].length();
                int len;
                char[] c1=temp[0].toCharArray();
                char[] c2=temp[2].toCharArray();
                int[] i1=new int[500];
                int[] i2=new int[500];
                for(int i=0;i<500;i++){
                    try{
                          i1[(500-len1+i)]=0;
                          i1[(500-len1+i)]=Integer.parseInt(String.valueOf(c1[i]));
                    }catch(Exception e){}
                    try{
                          i2[(500-len2+i)]=0;
                          i2[(500-len2+i)]=Integer.parseInt(String.valueOf(c2[i]));
                    }catch(Exception e){}
                }
                String c="";
                int over=0;
                boolean b1=true;
                switch (temp[1].toCharArray()[0]) {
                    case '+':
                        for(int i=499;i>0;i--){
                            c=String.valueOf((i1[i]+i2[i]+over)%10)+c;
                            over=(i1[i]+i2[i]+over)/10;
                       }
                       break;
                   case '-':
                       if(bigger(temp[0],temp[2])) c=Minus(temp[0],temp[2]);
                       else c="-"+Minus(temp[2],temp[0]);
                       break;
                   case '*':
                       c=x(temp[0],temp[2]);
                       break;
                   case '/':
                       if(len1==len2) c= String.valueOf(i1[500-len1]/i2[500-len2]);
                       else if(len2>len1) c="0";
                       else{
                              String over1="";
                              for(int i=0;i<=len1-len2;i++){
                                     String a;
                                     if(i==0) a=temp[0].substring(i,i+len2);
                                     else a=over1+temp[0].substring(len2+i-1,len2+i);
                                     String b=temp[2];
                                     int count=0;
                                     while(bigger(a,b)){
                                          a=Minus(a,b);
                                          count++;
                                     }
                              c+=String.valueOf(count);
                              over1=a;
                              }
                        }
                      break;
                 }
          for(int i=0;i<c.length();i++){
                    if(!c.substring(i,i+1).endsWith("0")){
                         System.out.println(c.substring(i));
                         break; 
                    }else{
                    if(i==c.length()-1) System.out.println(c.substring(i));
          }
        }
      }
}
public static String Minus(String a,String b){
int len1=a.length();
int len2=b.length();
char[] c1=a.toCharArray();
char[] c2=b.toCharArray();
int[] i1=new int[500];
int[] i2=new int[500];
String c="";
for(int i=0;i<500;i++){
try{
i1[(500-len1+i)]=0;
i1[(500-len1+i)]=Integer.parseInt(String.valueOf(c1[i]));
}catch(Exception e){
}
try{
i2[(500-len2+i)]=0;
i2[(500-len2+i)]=Integer.parseInt(String.valueOf(c2[i]));
}catch(Exception e){
}
}
int over=0;
for(int i=499;i>0;i--){
c=String.valueOf((i1[i]-i2[i]+over+10)%10)+c;
over=(i1[i]-i2[i]+over+10)/10-1;
}
String result="";
for(int i=0;i<c.length();i++){
if(!c.substring(i,i+1).endsWith("0")){
result+=c.substring(i);
break;
}else{
if(i==c.length()-1) result+=c.substring(i);
}
}
return result;
}
public static String x(String a,String b){
int len1=a.length();
int len2=b.length();
char[] c1=a.toCharArray();
char[] c2=b.toCharArray();
int[] i1=new int[500];
int[] i2=new int[500];
String c="";
for(int i=0;i<500;i++){
try{
i1[(500-len1+i)]=0;
i1[(500-len1+i)]=Integer.parseInt(String.valueOf(c1[i]));
}catch(Exception e){
}
try{
i2[(500-len2+i)]=0;
i2[(500-len2+i)]=Integer.parseInt(String.valueOf(c2[i]));
}catch(Exception e){
}
}
int over=0;
int[] tempi=new int[999];
for(int i=499;i>0;i--){
if(i1[i]!=0){
for(int j=499;j>0;j--){
if(i2[j]!=0)tempi[i+j]+=(i1[i]*i2[j]);
}
}
}
for(int i=998;i>497;i--){
c=String.valueOf((tempi[i]+over)%10)+c;
over=(tempi[i]+over)/10;
}
String result="";
for(int i=0;i<c.length();i++){
if(!c.substring(i,i+1).endsWith("0")){
result+=c.substring(i);
break;
}else{
if(i==c.length()-1) result+=c.substring(i);
}
}
return result;
}
public static boolean bigger(String a,String b){
if(a.length()>b.length())return true;
else if(a.length()<b.length())return false;
else{
for(int i=0;i<a.length();i++){
int a1=Integer.parseInt(a.substring(i,i+1));
int b1=Integer.parseInt(b.substring(i,i+1));
if(a1>b1){
return true;
}else if(a1<b1) return false;
else{}
}
}
return true;
}
}

arrow
arrow

    小新 發表在 痞客邦 留言(0) 人氣()