编程题目:
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*", "");
}
}
结果显示:
版权声明:本文为jsc123581原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。