
正文
超大整数减法java代码 超大整数减法java代码怎么写
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
求程序设计源代码:大整数加减法程序~~~拜托~~~
储存大整数很容易 用一个int数组就可以了
例如 array[0] = 1234567890
array[1] = 1234567890
合起来就是 12345678901234567890
运算的时候有点麻烦
不过有个取巧的办法
你读取 12345678901234567890 + 1234567890 的时候 截获 "+"
然后 用 后面的那个1234567890 和 a[0] 相加 如果a[0]超过10位 就把第11位 加到 a[1]里面 做为进位
减法相反即可。
如果是C# msdn 里面有 加减乘除
相关问答
Q1: JAVA超大整数的加法如何改成减法
你这个道题很有意思,应该是怎么使用算法吧:
减法从各位开始计算,需要判断减数和被减数的大小:
A. 当减数 = 被减数,标记后一位不用退位
B. 当减数 被减数,标记后一位需要退位
代码如下:
public class HandleLargeNumber {
public static void main(String[] args) {
int a[] = { 0, 9, 9, 7, 9, 4, 5, 6, 7, 2, 3, 4, 5, 6, 4, 7, 8, 9, 8, 7, 6, 9 };
int b[] = { 0, 0, 5, 9, 1, 6, 4, 5, 6, 2, 3, 4, 5, 7, 2, 1, 3, 4, 0, 3, 2, 9 };
jianFa(a,b);
// 下面是验证:通过BigInteger来做
BigInteger a1 = new BigInteger("997945672345647898769");
BigInteger a2 = new BigInteger("59164562345721340329");
System.out.println(a1.subtract(a2));
}
public static void jianFa(int[] a, int[] b) {
int idx1 = getStart(a);
print(a, idx1);
int idx2 = getStart(b);
print(b, idx2);
boolean isTui = false; // 是否退位标记
int c[] = new int[a.length];
for (int i = a.length; i idx1; i--) {
if (!isTui) {
// 不退位
int aNum = a[i - 1];
int bNum = b[i - 1];
if (aNum = bNum) {
c[i - 1] = aNum - bNum;
isTui = false;
} else {
c[i - 1] = 10 + aNum - bNum;
isTui = true;
}
} else {
// 退位
int aNum = a[i - 1] - 1;
int bNum = b[i - 1];
if (aNum = bNum) {
c[i - 1] = aNum - bNum;
isTui = false;
} else {
c[i - 1] = 10 + aNum - bNum;
isTui = true;
}
}
}
System.out.printf("\n等于:\n");
print(c, getStart(c));
}
private static int getStart(int[] arr){
for (int i = 0; i arr.length; i++) {
if (arr[i] != 0) {
return i;
}
}
return 0;
}
private static void print(int[] arr, int start){
for (int i = start; i arr.length; i++) {
System.out.printf("%d", arr[i]);
}
System.out.print("\n");
}
}
上面的例子只适用用减数大于被减数,当减数小于被减数时,需要额外的计算,不过思路差不多,复杂度大了很多,呵呵。
亲,如果回答满意,请及时采纳,谢谢!!!
Q2: 求 大整数减法 的代码 C或C++
#include iostream
#include string
using namespace std;
inline int compare(string str1,string str2) {//相等返回0,大于返回1,小于返回-1
if (str1.size()str2.size()) return 1; //长度长的整数大于长度小的整数
else if (str1.size()str2.size()) return -1;
else return str1.compare(str2); //若长度相等,则头到尾按位比较
}
string SUB_INT(string str1,string str2);
string ADD_INT(string str1,string str2);
string ADD_INT(string str1,string str2) {//高精度加法
int sign=1; //sign 为符号位
string str;
if (str1[0]=='-') {
if (str2[0]=='-') {
sign=-1;
str=ADD_INT(str1.erase(0,1),str2.erase(0,1));
} else {
str=SUB_INT(str2,str1.erase(0,1));
}
} else {
if (str2[0]=='-') {
str=SUB_INT(str1,str2.erase(0,1));
} else { //把两个整数对齐,短整数前面加0补齐
string::size_type L1,L2;
int i;
L1=str1.size();
L2=str2.size();
if (L1L2) {
for (i=1;i=L2-L1;i++) str1="0"+str1;
} else {
for (i=1;i=L1-L2;i++) str2="0"+str2;
}
int int1=0,int2=0; //int2 记录进位
for (i=str1.size()-1;i=0;i--) {
int1=(int(str1[i])-'0'+int(str2[i])-'0'+int2)%10;
int2=(int(str1[i])-'0'+int(str2[i])-'0'+int2)/10;
str=char(int1+'0')+str;
}
if (int2!=0) str=char(int2+'0')+str;
}
}
//运算后处理符号位
if ((sign==-1)(str[0]!='0')) str="-"+str;
return str;
}
string SUB_INT(string str1,string str2) {//高精度减法
int sign=1; //sign 为符号位
string str;
int i,j;
if (str2[0]=='-') {
str=ADD_INT(str1,str2.erase(0,1));
} else {
int res=compare(str1,str2);
if (res==0) return "0";
if (res0) {
sign=-1;
string temp =str1;
str1=str2;
str2=temp;
}
string::size_type tempint;
tempint=str1.size()-str2.size();
for (i=str2.size()-1;i=0;i--) {
if (str1[i+tempint]str2[i]) {
j=1;
while (1) {//zhao4zhong1添加
if (str1[i+tempint-j]=='0') {
str1[i+tempint-j]='9';
j++;
} else {
str1[i+tempint-j]=char(int(str1[i+tempint-j])-1);
break;
}
}
str=char(str1[i+tempint]-str2[i]+':')+str;
} else {
str=char(str1[i+tempint]-str2[i]+'0')+str;
}
}
for (i=tempint-1;i=0;i--) str=str1[i]+str;
}
//去除结果中多余的前导0
str.erase(0,str.find_first_not_of('0'));
if (str.empty()) str="0";
if ((sign==-1) (str[0]!='0')) str ="-"+str;
return str;
}
int main() {
char ch;
string s1,s2,res;
cout "请输入两个数:" endl;
cins1chs2;
cout SUB_INT(s1,s2) endl;
return(0);
}
Q3: 怎样实现java中超长整数减法?
超长整数类型;long
定义的时候:long i = 123456789L;//比普通的int值后面多了一个L,大小写都行。
然后就可以加减乘除了。
比如:i-123
Q4: Java实现两个无限大的数的加减乘除运算
根据你的要求,我写了一下代码,如下:package com.fer2005.test;public class AddUtil { /**
* @param a1 大数字1,按数组存储
* @param a2 大数字2,按数组存储
* @return 返回结果数组
*/
public int[] getResult(int[] a1,int[] a2){
//取最大的长度作为返回结果的长度,此时未考虑是否有进位
int length=a1.lengtha2.length?a1.length:a2.length;
//新建未考虑进位的数组结果
int[] tmp_res =new int[length];
int i=0;
//循环相加得到res的按照最短数组相加的结果
while(ia1.lengthia2.length){
i++;
tmp_res[length-i]=a1[a1.length-i]+a2[a2.length-i];
}
//操作完成后,需将长数组的值赋给res
//a1的长度说明a1比a2长度小,res需要获取a2的前几位
if(a1.lengtha2.length){
while(length-i0){
tmp_res[length-i-1]=a2[a2.length-i-1];
i++;
}
}else if(a1.lengtha2.length){
//说明a2比a1长度小,res需要获取a1的前几位
while(length-i0){
tmp_res[length-i-1]=a1[a1.length-i-1];
i++;
}
} //考虑进位问题,如果某一元素大于10,则本身减10,前一元素加1,如果第一个元素大于10,特殊处理。
//需处理相加之和大于10的情况
for(int k=tmp_res.length-1;k0;k--){
if(tmp_res[k]=10){
tmp_res[k-1]=tmp_res[k-1]+1;
tmp_res[k]=tmp_res[k]-10;
}
}
int[] res=new int[length+1];
//首位情况特殊处理
if(tmp_res[0]=10){
res[0]=1;
res[1]=tmp_res[0]-10;
for(int m=1;mtmp_res.length;m++){
res[m+1]=tmp_res[m];
}else{ res=tmp_res; }
}
return res;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
AddUtil addUtil = new AddUtil();
int[] a1= {9,2,3,8,5};
int[] a2={1,9,2,3,9};
for(int j:addUtil.getResult(a1, a2)){
System.out.print(j+",");
}
}}
Q5: 超级大的整数加减法,输入时要有正负号。希望能写一下代码。c语言
#include stdio.h
#include string.h
#include malloc.h
const int MAXSIZE = 122;
// 完成以字符串形式的两个大数相加。返回字符串形式的和。
// tatol ← addnum1 + addnum2
char *LargeNumberAdd(char const *addnum1,char const *addnum2, char *total) {
int i,j,k = 0,len,result,carry = 0;
int len1 = strlen(addnum1);
int len2 = strlen(addnum2);
for(i = len1 - 1,j = len2 - 1; i = 0 j = 0; --i,--j) {
result = addnum1[i] - '0' + addnum2[j] - '0' + carry;
carry = result/10;
total[k++] = result%10 + '0';
}
while(i = 0) {
result = addnum1[i--] - '0' + carry;
carry = result/10;
total[k++] = result%10 + '0';
}
while(j = 0) {
result = addnum2[j--] - '0' + carry;
carry = result/10;
total[k++] = result%10 + '0';
}
if(carry) total[k++] = carry + '0';
total[k] = '\0';
len = strlen(total);
for(i = 0; i len/2; ++i) {
k = total[i];
total[i] = total[len - 1 - i];
total[len - 1 - i] = k;
}
return total;
}
// 完成以字符串形式的两个大数相减。返回字符串形式的差。
// difference ← subnum1 - subnum2
char *LargeNumberSub(char *subnum1,char *subnum2, char *difference) {
int i,j,k,result,borrow = 0;
int sign = 0,swap = 0;
int maxl,minl;
char *pta,*ptb;
int len1 = strlen(subnum1);
int len2 = strlen(subnum2);
if(len1 == len2) {//两数位数相等时
for(i = 0; i len1; ++i) {//从高位开始比较,某位大时,这个数就大,相等时继续比较,某位小时,这个数就小
if(subnum1[i] == subnum2[i]) continue;
else if(subnum1[i] subnum2[i]) {
swap = 1;
break;
}
else {
swap = 0;
break;
}
}
}
if(len2 len1 || swap) {//减数大于被减数
pta = (char *)malloc((len2 + 1)*sizeof(char)); // pta总是指向绝对值更大的数
ptb = (char *)malloc((len1 + 1)*sizeof(char)); // 而ptb指向绝对值更小的数
strcpy(pta,subnum2);
strcpy(ptb,subnum1);
maxl = len2;
minl = len1;
sign = 1;
}
else {//被减数大于减数
pta = (char *)malloc((len1 + 1)*sizeof(char)); // pta总是指向绝对值更大的数
ptb = (char *)malloc((len2 + 1)*sizeof(char)); // 而ptb指向绝对值更小的数
strcpy(pta,subnum1);
strcpy(ptb,subnum2);
maxl = len1;
minl = len2;
sign = 0;
}
for(i = maxl - 1,j = minl - 1,k = 0; j = 0; --i,--j) {//从个位开始减
result = pta[i] - ptb[j] - borrow;
if(result 0) {
result += 10;
borrow = 1;
}
else borrow = 0;
difference[k++] = result + '0';
}
while(i = 0) {
result = pta[i--] - '0' - borrow;
if(result 0) {
result += 10;
borrow = 1;
}
else borrow = 0;
difference[k++] = result + '0';
}
--k;
while(difference[k] == '0' k 0) --k;//去除差数前端冗余的'0'
if(sign) difference[++k] = '-';
difference[++k] = '\0';
for(i = 0; i k/2; ++i) {
result = difference[i];
difference[i] = difference[k - 1 - i];
difference[k - 1 - i] = result;
}
free(pta);
free(ptb);
return difference;
}
int main() {
char s[MAXSIZE] = "4561239986547";
char t[MAXSIZE] = "4560658897546";
char result[MAXSIZE + 1];
printf("%s + %s = %s\n",s,t,LargeNumberAdd(s,t,result));
printf("%s - %s = %s\n",s,t,LargeNumberSub(s,t,result));
printf("%s - %s = %s\n",t,s,LargeNumberSub(t,s,result));
return 0;
}
超大整数减法java代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于超大整数减法java代码怎么写、超大整数减法java代码的信息别忘了在本站进行查找喔。








