日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java大数加法乘法减法、36进制加法

發(fā)布時(shí)間:2024/9/30 java 89 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java大数加法乘法减法、36进制加法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 大數(shù)加法
  • 大數(shù)減法
    • c++版本
    • Java版本
  • 大數(shù)乘法
  • 36進(jìn)制加法
    • c++版
    • Java版


大數(shù)加法

1、是整數(shù); 2、兩個(gè)數(shù)無(wú)限大,long都裝不下; 3、不能用BigInteger; 4、不能用任何包裝類提供的運(yùn)算方法; 5、兩個(gè)數(shù)都是以字符串的方式提供。

/*** 思路: * 字符串逐位相加,需要進(jìn)位則進(jìn)位處理,考慮兩個(gè)問題: * 1、char怎么轉(zhuǎn)換為integer, 減去'0'即可* 2、怎么處理對(duì)應(yīng)位相加?反轉(zhuǎn)字符串相加,正確處理進(jìn)位即可,* 這樣個(gè)位對(duì)應(yīng)個(gè)位,十位對(duì)應(yīng)十位,剩余的直接追加 * */public static String add(String str1, String str2) {char[]arr1 = new StringBuilder(str1).reverse().toString().toCharArray();char[]arr2 = new StringBuilder(str2).reverse().toString().toCharArray();int maxlen = arr1.length>arr2.length?arr1.length:arr2.length;int [] newlen = new int[maxlen+1];for (int i = 0; i < maxlen; i++) {int an1 = i < arr1.length?arr1[i]-'0':0;int an2 = i < arr2.length?arr2[i]-'0':0;newlen[i] = an1+an2;}for (int i = 0; i < newlen.length; i++){if(newlen[i] >= 10){newlen[i+1] += newlen[i]/10;newlen[i] %=10;}}StringBuilder ans = new StringBuilder();for (int i = newlen.length-1; i >=0;i--) {ans.append(newlen[i]);}if(ans.toString().charAt(0)=='0'){return ans.toString().substring(1,ans.length());//去掉開頭可能有的0}return ans.toString();} public static void main(String[] args) {System.out.println( add("9234","22999999999")); }

大數(shù)減法

題目描述
給定兩個(gè)字符串形式的非負(fù)整數(shù) num1 和num2 ,計(jì)算它們的差。

注意:

num1 和num2 都只會(huì)包含數(shù)字 0-9
num1 和num2 都不包含任何前導(dǎo)零
你不能使用任何內(nèi)建 BigInteger 庫(kù)
兩個(gè)非負(fù)整數(shù)相減的結(jié)果可能為負(fù)。

因此,首先比較兩個(gè)數(shù)的大小。

如代碼所示,當(dāng)小減大時(shí),需將兩個(gè)參數(shù)調(diào)換一下位置執(zhí)行減法,在結(jié)果前填上負(fù)號(hào)即可

注意:結(jié)果為0時(shí)不加負(fù)號(hào)。

如何比較兩個(gè)大數(shù)的大小呢?

由于是大數(shù),肯定不能直接轉(zhuǎn)成int比較。

我們可以比較兩個(gè)字符串的長(zhǎng)度。

長(zhǎng)度更長(zhǎng)的字符串,數(shù)一定更大;當(dāng)長(zhǎng)度一樣的就去比較字典序。

c++版本

bool isLess(string a, string b) {if (a.size() == b.size()) return a < b;return a.size() < b.size(); }

減法操作代碼:

string sub(string a, string b) {string res = "";int borrow = 0;int i = a.size() - 1, j = b.size() - 1;while (i >= 0 || j >= 0) {int x = i >= 0 ? (a[i] - '0') : 0; //字符轉(zhuǎn)整數(shù)int y = j >= 0 ? (b[j] - '0') : 0; //字符轉(zhuǎn)整數(shù)int z = (x - borrow - y + 10) % 10;res += ('0' + z); //整數(shù)轉(zhuǎn)成字符borrow = x - borrow - y < 0 ? 1 : 0;i--, j--;}reverse(res.begin(), res.end());//刪除前導(dǎo)0,注意邊界是res.size()-1!!防止當(dāng)res為"0000"時(shí),刪為""的清空int pos;for (pos = 0; pos < res.size() - 1; pos++) {if (res[pos] != '0') break;}return res.substr(pos); }

主方法:

string subStrings(string num1, string num2) {string res;if (isLess(num1, num2)) {res = sub(num2, num1);if (res != "0") res.insert(0, "-");}else res = sub(num1, num2);return res; }

Java版本

public boolean isless(String a,String b)//判斷兩個(gè)字符串大小{if(a.length()==b.length()) if( a.compareTo(b)<0){ return true;}else {return false;}else return a.length()<b.length();}public String reverse(String s){//字符串反轉(zhuǎn)char[]arr = new char[s.length()];int i = 0,j = s.length()-1;while(i <=j){arr[i] = s.charAt(j);arr[j] = s.charAt(i);i++;j--;}return new String(arr);}public String sub(String a,String b){//兩個(gè)字符串相減int i = a.length()-1,j=b.length()-1;int borrow=0;String ans="";while(i>=0||j>=0){int x = i>=0?(a.charAt(i)-'0'):0;int y = j>=0?(b.charAt(j)-'0'):0;int result = (x-borrow-y+10)%10;ans+=result;borrow = x-borrow-y<0?1:0;i--;j--;}ans=reverse(ans);int ii = 0;for(ii= 0;ii<ans.length();ii++)if(ans.charAt(ii)!='0') break;return ans.substring(ii,ans.length());}public String mainope(String a,String b){//用于判斷兩個(gè)字符串哪個(gè)大,如果是小的減去大的則在答案前面加符號(hào),且最后的結(jié)果轉(zhuǎn)化為字符串輸出String res="";StringBuilder str= new StringBuilder();if(isless(a,b)){res = sub(b,a);if(res!="0") {str.append("-");str.append(res);return str.toString();}else return "0";}else {return sub(a,b);}}

調(diào)用:

mainope("1000","8988");//輸出-7988

大數(shù)乘法

(字符串相乘)

給定兩個(gè)以字符串形式表示的非負(fù)整數(shù) num1 和 num2,返回 num1 和 num2 的乘積,它們的乘積也表示為字符串形式。

注意:不能使用任何內(nèi)置的 BigInteger 庫(kù)或直接將輸入轉(zhuǎn)換為整數(shù)。


public String multiply(String num1, String num2) { LinkedList<Integer>temp = new LinkedList<>(); if(num2.equals("0")||num1.equals("0")) return "0"; int[]ans = new int[num1.length()+num2.length()]; for(int i = num1.length()-1;i>=0;i--) {for(int j = num2.length()-1;j>=0;j--){int digi1 = num1.charAt(i)-'0';int digi2 = num2.charAt(j)-'0';int tot = ans[i+j+1]+digi1*digi2;ans[i+j+1]=tot%10;ans[i+j] += tot/10;} } String ut =""; boolean flag = true; for(int i = 0;i < ans.length;i++) {if(ans[i]==0&&flag)continue;flag = false;if(!flag) ut+=ans[i]; } return ut;}

36進(jìn)制加法

題目描述
36進(jìn)制由0-9,a-z,共36個(gè)字符表示。

要求按照加法規(guī)則計(jì)算出任意兩個(gè)36進(jìn)制正整數(shù)的和,如1b + 2x = 48 (解釋:47+105=152)

要求:不允許使用先將36進(jìn)制數(shù)字整體轉(zhuǎn)為10進(jìn)制,相加后再轉(zhuǎn)回為36進(jìn)制的做法
參考代碼

c++版

#include <iostream> #include <algorithm> using namespace std;char getChar(int n) {if (n <= 9)return n + '0';elsereturn n - 10 + 'a'; } int getInt(char ch) {if ('0' <= ch && ch <= '9')return ch - '0';elsereturn ch - 'a' + 10; } string add36Strings(string num1, string num2) {int carry = 0;int i = num1.size() - 1, j = num2.size() - 1;int x, y;string res;while (i >= 0 || j >= 0 || carry){x = i >= 0 ? getInt(num1[i]) : 0;y = j >= 0 ? getInt(num2[j]) : 0;int temp = x + y + carry;res += getChar(temp % 36);carry = temp / 36;i--, j--;}reverse(res.begin(), res.end());return res; }int main() {string a = "1b", b = "2x", c;c = add36Strings(a, b);cout << c << endl; }

Java版

public String reverse(String s){char[]arr = new char[s.length()];int i = 0,j = s.length()-1;while(i <=j){arr[i] = s.charAt(j);arr[j] = s.charAt(i);i++;j--;}return new String(arr);}public char getchar(int n){if(n<=9)return (char) (n+'0');else return (char) (n+'a'-10);}public int getint(char ch){if(ch<='9')return ch-'0';elsereturn ch-'a'+10;}public String add36(String a,String b){ String ans=""; int len1=a.length()-1,len2=b.length()-1; int carry=0; while(len1>=0||len2>=0) {int x=len1>=0?getint(a.charAt(len1)):0;int y = len2>=0?getint(b.charAt(len2)):0;int result = (x+y+carry)%36;carry = (x+y+carry)/36;ans+=getchar(result);len1--;len2--; } ans = reverse(ans); return ans;} add36("1de0","8f88")//輸出9sm8

總結(jié)

以上是生活随笔為你收集整理的Java大数加法乘法减法、36进制加法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。