2つの整数加算(Java)
5255 ワード
タイトル:
任意の2つの整数の加算を実現できる関数を定義します.
考え方:
2つの数の大きさの範囲を限定していないので,我々もそれを大数問題として扱う.前のブログでは文字列表示の数字に1を加える機能を実現しており、この考え方を参考に2つの数字の加算機能を実現することができます.また、入力した数字に負数がある場合、どのように処理すればいいのかという主な問題があります.
まず状況を分ける必要があります.2つの整数の加算(整数は正数、0、負数を含む).従って(1):2つの正数の加算、(2)1つの正数の1つの負数の加算、(3)2つの負数の加算;第1と第3の場合は実際には1つと見なすことができ、2つの絶対値の加算で、2つの数が正数であれば処理しないが、2つの数が負数であれば加算の結果の前に+記号である.
コード:
テスト:
まとめ:
大きな数の代わりに文字列や文字配列を使うことを学ばなければならない.
任意の2つの整数の加算を実現できる関数を定義します.
考え方:
2つの数の大きさの範囲を限定していないので,我々もそれを大数問題として扱う.前のブログでは文字列表示の数字に1を加える機能を実現しており、この考え方を参考に2つの数字の加算機能を実現することができます.また、入力した数字に負数がある場合、どのように処理すればいいのかという主な問題があります.
まず状況を分ける必要があります.2つの整数の加算(整数は正数、0、負数を含む).従って(1):2つの正数の加算、(2)1つの正数の1つの負数の加算、(3)2つの負数の加算;第1と第3の場合は実際には1つと見なすことができ、2つの絶対値の加算で、2つの数が正数であれば処理しないが、2つの数が負数であれば加算の結果の前に+記号である.
コード:
//
public char[] addStrNums(String str1, String str2) {
char[] num1 = str1.toCharArray(); // 1 1
char[] num2 = str2.toCharArray(); // 2 2
int nTakeOver = 0; //
boolean flag = false; // , true, false
char num[] = null;
int nsum = 0;
// +
if ((num1[0] == '-' && num2[0] != '-')
|| (num1[0] != '-' && num2[0] == '-')) {
if (num1[0] == '-' && num2[0] != '-') { // num1 ,num2
num1 = numsAbs(num1);
num2 = numsAbs(num2);
if (getMaxAbs(num2, num1)) { // num2>num1,
char temp[] = num1;
num1 = num2;
num2 = temp;
flag = false;
} else { //
flag = true;
}
} else {
num1 = numsAbs(num1);
num2 = numsAbs(num2);
if (getMaxAbs(num2, num1)) { // num2>num1,
flag = true;
char temp[] = num1;
num1 = num2;
num2 = temp;
} else { //
flag = false;
}
}
num = new char[num1.length];
for (int i = num1.length - 1, j = num2.length - 1; i >= 0; --i, --j) {
if (j >= 0) {
nsum = num1[i] - num2[j] + nTakeOver;
if (nsum < 0) {
// 0
nTakeOver = -1;
nsum = nsum + 10;
num[i] = (char) (nsum + '0');
} else {
nTakeOver = 0;
num[i] = (char) (nsum + '0');
}
} else {
nsum = num1[i] + nTakeOver - '0';
if (nsum < 0) {
nTakeOver = -1;
nsum = nsum + 10;
num[i] = (char) (nsum + '0');
} else {
nTakeOver = 0;
num[i] = (char) (nsum + '0');
}
}
}
} else { //
if ((num1[0] == '-' && num2[0] == '-')) {
num1 = numsAbs(num1);
num2 = numsAbs(num2);
flag = true; //
}else{
num1 = numsAbs(num1);
num2 = numsAbs(num2);
flag = false; //
}
if (getMaxAbs(num2, num1)) { // num1 num2
char temp[] = num1;
num1 = num2;
num2 = temp;
}
num = new char[num1.length];
for (int i = num1.length - 1, j = num2.length - 1; i >= 0; --i, --j) {
if (j >= 0) {
nsum = num1[i] - '0' + num2[j] - '0' + nTakeOver;
if (nsum >= 10) {
//
nTakeOver = 1;
nsum = nsum - 10;
num[i] = (char) (nsum + '0');
} else {
nTakeOver = 0;
num[i] = (char) (nsum + '0');
}
} else {
nsum = num1[i] - '0' + nTakeOver;
if (nsum >= 10) {
nTakeOver = 1;
nsum = nsum - 10;
num[i] = (char) (nsum + '0');
} else {
nTakeOver = 0;
num[i] = (char) (nsum + '0');
}
}
}
}
if(flag){ //
char []temp = new char[num.length + 1];
temp[0] = '-';
for (int i = 0; i < num.length; i++) {
temp[i + 1] = num[i];
}
return temp;
}else{
return num;
}
}
//
public char[] numsAbs(char[] nums) {
if (nums[0] != '-' && nums[0] != '+') { // '-'
return nums;
}
char temp[] = new char[nums.length - 1];
for (int i = 0; i < temp.length; ++i) {
temp[i] = nums[i + 1];
}
return temp;
}
//
public boolean getMaxAbs(char num1[], char num2[]) {
num1 = numsAbs(num1);
num2 = numsAbs(num2);
int len1 = num1.length;
int len2 = num2.length;
if (len1 > len2) { // num1 num2, true
return true;
} else if (len1 < len2) { // num1 num2, false
return false;
} else {
for (int i = 0; i < len1; i++) { // num1 num2 ,
if (num1[i] > num2[i]) { // num1 , true
return true;
} else if (num1[i] < num2[i]) { // num2 , false,
return false;
}
}
}
return true;
}
//
private void printNumber(char[] number) {
boolean isBeginning0=true;
boolean isJudge0 = true;
// '-' i 1 0
int i=0;
if(number[0]=='-')
{
System.out.print(number[0]);
++i;
}
for(; i
テスト:
public static void main(String[] args) {
Main2 m2 = new Main2();
char[] nums = m2.addStrNums("+123", "-123");
m2.printNumber(nums);
char[] nums1 = m2.addStrNums("+123", "+123");
m2.printNumber(nums1);
char[] nums2 = m2.addStrNums("-123", "-123");
m2.printNumber(nums2);
char[] nums3 = m2.addStrNums("-123", "+123");
m2.printNumber(nums3);
}
まとめ:
大きな数の代わりに文字列や文字配列を使うことを学ばなければならない.