編程題目:
70.有兩個數,一個數是123789965783241232323512323676678,
另一個數是23245235435436807768829454365465889,用算法實現這兩個正數的加減以及相乘。
示例代碼:
package program.calculation.exercise70;
/**
* 70.有兩個數,一個數是123789965783241232323512323676678,
* 另一個數是23245235435436807768829454365465889,
* 用算法實現這兩個正數的加減以及相乘。
*/
public class MyBigInteger {
public static void main(String[] args) {
String str1 = "123789965783241232323512323676678";
String str2 = "23245235435436807768829454365465889";
//String str1 = "240";
//String str2 = "12";
System.out.println("兩數之和:"+add(str1, str2));
System.out.println("兩數之差:"+subtract(str1, str2));
System.out.println("兩數之積:"+multiply(str1, str2));
}
//相加
private static String add(String str1, String str2) {
//將str1與str2的位數設爲相同,不同的前面補0
if(str1.length() >= str2.length()){
for(int i=str2.length();i<str1.length();i++){
str2 = "0"+str2;
}
}else{
for(int i=str1.length();i<str2.length();i++){
str1 = "0"+str1;
}
}
int num1[] = new int[str1.length()];//大數1
int num2[] = new int[str2.length()];//大數2
int num3[] = new int[str1.length()+1];//結果數組 ,兩數相加有可能進位,所以結果數組長度應加1
//將字符串轉換成字符,然後再轉換成數字
for (int i=0;i<num1.length;i++) {
num1[i] = str1.charAt(num1.length-1-i)-48;//大數1,數字0的ASCII碼值爲48
}
for (int i=0;i<num2.length;i++) {
num2[i] = str2.charAt(num2.length-1-i)-48;//大數2
}
//num3調整 :對num3進行判斷可能存在一個位置是兩位數字的情況
for (int i=0;i<num1.length;i++) {
int temp1 = (num1[i]+num2[i])/10;//進位
int temp2 = (num1[i]+num2[i])%10;//本位
num3[i] = num3[i]+temp2;
num3[i+1] = num3[i+1]+temp1;
}
//判斷結果num3是否以零開頭,若爲零則不顯示
String str = "";
for(int i=num3.length-1;i>=0;i--){
str += num3[i];
}
return str.replaceAll("^0*", "");
}
//相減
private static String subtract(String str1, String str2) {
//如果兩個數相等,則結果爲0
if(str1.equals(str2)){
return "0";
}
//將str1與str2的位數設爲相同,不同的前面補0
if(str1.length() >= str2.length()){
for(int i=str2.length();i<str1.length();i++){
str2 = "0"+str2;
}
}else{
for(int i=str1.length();i<str2.length();i++){
str1 = "0"+str1;
}
}
int num1[] = new int[str1.length()];//大數1
int num2[] = new int[str2.length()];//大數2
int num3[] = new int[str1.length()];//結果數組
//將字符串轉換成字符,然後再轉換成數字
for (int i=0;i<num1.length;i++) {
num1[i] = str1.charAt(num1.length-1-i)-48;//大數1,數字0的ASCII碼值爲48
}
for (int i=0;i<num2.length;i++) {
num2[i] = str2.charAt(num2.length-1-i)-48;//大數2
}
//判斷哪個數更大
boolean bigger = false;
for(int i=0;i<num1.length;i++){
if(num1[i] > num2[i]){
bigger = true;
}
if(num1[i] < num2[i]){
bigger = false;
}
}
//獲取num3,但num3有可能以零開頭
for (int i=0;i<num1.length;i++) {
if(bigger){
num3[i] = num1[i]-num2[i];
if(num3[i] < 0){ //若相減小於零,則向前借位
num1[i+1] -= 1; //向前借1位
num1[i] += 10; //本位加10
}
num3[i] = num1[i]-num2[i];
}else{
num3[i] = num2[i]-num1[i];
if(num3[i] < 0){
num2[i+1] -= 1;
num2[i] += 10;
}
num3[i] = num2[i]-num1[i];
}
}
//判斷結果num3是否以零開頭,若爲零則不顯示
String str = "";
for(int i=num3.length-1;i>=0;i--){
str += num3[i];
}
return str.replaceAll("^0*", "");
}
//相乘
private static String multiply(String str1, String str2) {
int num1[] = new int[str1.length()];//大數1
int num2[] = new int[str2.length()];//大數2
int num3[] = new int[str1.length()+str2.length()];//結果數組
//將字符串轉換成字符,然後再轉換成數字
for (int i=0;i<num1.length;i++) {
num1[i] = str1.charAt(num1.length-1-i)-48;//大數1,數字0的ASCII碼值爲48
}
for (int i=0;i<num2.length;i++) {
num2[i] = str2.charAt(num2.length-1-i)-48;//大數2
}
//num3調整 :對num3進行判斷可能存在一個位置是兩位數字的情況
for (int i=0;i<num1.length;i++) {
for (int j=0;j<num2.length;j++) {
int temp1 = num1[i]*num2[j]/10;//進位
int temp2 = num1[i]*num2[j]%10;//本位
num3[i+j] = num3[i+j]+temp2;
num3[i+j+1] = num3[i+j+1]+temp1;
}
}
//判斷結果num3是否以零開頭,若爲零則不顯示
String str = "";
for(int i=num3.length-1;i>=0;i--){
str += num3[i];
//System.out.println(num3[i]);
}
return str.replaceAll("^0*", "");
}
}