欢迎访问 生活随笔!

ag凯发k8国际

当前位置: ag凯发k8国际 > 编程语言 > java >内容正文

java

java大数加法乘法减法、36进制加法 -ag凯发k8国际

发布时间:2024/9/30 java 15 豆豆
ag凯发k8国际 收集整理的这篇文章主要介绍了 java大数加法乘法减法、36进制加法 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

文章目录

  • 大数加法
  • 大数减法
    • c 版本
    • java版本
  • 大数乘法
  • 36进制加法
    • c 版
    • java版

1、是整数; 2、两个数无限大,long都装不下; 3、不能用biginteger; 4、不能用任何包装类提供的运算方法; 5、两个数都是以字符串的方式提供。

/*** 思路: * 字符串逐位相加,需要进位则进位处理,考虑两个问题: * 1、char怎么转换为integer, 减去'0'即可* 2、怎么处理对应位相加?反转字符串相加,正确处理进位即可,* 这样个位对应个位,十位对应十位,剩余的直接追加 * */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[maxlen1];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] = an1an2;}for (int i = 0; i < newlen.length; i){if(newlen[i] >= 10){newlen[i1] = 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")); }

题目描述
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的差。

注意:

num1 和num2 都只会包含数字 0-9
num1 和num2 都不包含任何前导零
你不能使用任何內建 biginteger 库
两个非负整数相减的结果可能为负。

因此,首先比较两个数的大小。

如代码所示,当小减大时,需将两个参数调换一下位置执行减法,在结果前填上负号即可

注意:结果为0时不加负号。

如何比较两个大数的大小呢?

由于是大数,肯定不能直接转成int比较。

我们可以比较两个字符串的长度。

长度更长的字符串,数一定更大;当长度一样的就去比较字典序。

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; //字符转整数int y = j >= 0 ? (b[j] - '0') : 0; //字符转整数int z = (x - borrow - y 10) % 10;res = ('0' z); //整数转成字符borrow = x - borrow - y < 0 ? 1 : 0;i--, j--;}reverse(res.begin(), res.end());//删除前导0,注意边界是res.size()-1!!防止当res为"0000"时,删为""的清空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)//判断两个字符串大小{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){//字符串反转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){//两个字符串相减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-y10)%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){//用于判断两个字符串哪个大,如果是小的减去大的则在答案前面加符号,且最后的结果转化为字符串输出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);}}

调用:

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

(字符串相乘)

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

注意:不能使用任何内置的 biginteger 库或直接将输入转换为整数。


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[ij1]digi1*digi2;ans[ij1]=tot%10;ans[ij] = 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进制由0-9,a-z,共36个字符表示。

要求按照加法规则计算出任意两个36进制正整数的和,如1b 2x = 48 (解释:47 105=152)

要求:不允许使用先将36进制数字整体转为10进制,相加后再转回为36进制的做法
参考代码

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 = (xycarry)%36;carry = (xycarry)/36;ans =getchar(result);len1--;len2--; } ans = reverse(ans); return ans;} add36("1de0","8f88")//输出9sm8

总结

以上是ag凯发k8国际为你收集整理的java大数加法乘法减法、36进制加法的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得ag凯发k8国际网站内容还不错,欢迎将ag凯发k8国际推荐给好友。

  • 上一篇:
  • 下一篇:
网站地图