菜鸟提问:用数组实现大数运算 我是刚学java的菜鸟,前几天我与道个问题,怎样用数组实现大数的运算,想了很久不知如何下手,青各位大侠多指点指点 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 大数运算的种类很多,看看我的博客,有一个大数相乘的例子,使用数组实现的,可惜是Delphi的,不知楼主能否看懂?http://datafans.blog.163.com/blog/static/8572788420094232462909/ 偶的java版本数据结构上有 自己也在学习中 明天 有可能就给你代码 这里有下, 将String转化为数组, 再进行运算.http://download.csdn.net/source/1352494 其实大数运算,基本上还是手工模拟!我给你给个我原来在OJ上写的个大数相加,相乘也一样,除法就是减法,小数部分就是添0再减,直到自己要的精度为止.#include<stdio.h>#include<string.h>#define MAX 2000int Add(char a[],char b[],int x){ int i,flag; int add; for(i=MAX-1;i>=MAX-x;--i) { add=a[i]-'0'+b[i]-'0'; if(add>=10) { a[i]=add-10+'0'; a[i-1]+=1; flag=1; } else { a[i]=add+'0'; flag=0; } } if(flag) { ++x; } return x;}int main(void){ char a[MAX],b[MAX]; int k,z,n; int x,y,m; for(k=0;k<MAX;++k) { a[k]='0'; b[k]='0'; } m=scanf("%s %s",a,b); while(m==2) { x=strlen(a); y=strlen(b); z=x>y?x:y; a[x]='0'; b[y]='0'; for(k=1;k<=x;++k) { a[MAX-k]=a[x-k]; } for(k=1;k<=y;++k) { b[MAX-k]=b[y-k]; } n=Add(a,b,z); for(k=MAX-n;k<MAX;++k) { printf("%c",a[k]); } printf("\n"); for(k=0;k<MAX;++k) { a[k]='0'; b[k]='0'; } m=scanf("%s %s",a,b); } return 0;} 大数相加减import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class BigNumber { public static int[] add(int[] a, int[] b) { int digit = 0; int[] c = new int[a.length]; for (int i = a.length - 1; i >= 0; i--) { c[i] = a[i] + b[i] + digit; if (c[i] < 10) digit = 0; else { c[i] = c[i] - 10; digit = 1; } } return c; } public static int[] sub(int[] a, int[] b, int w) { int digit = 0; int[] c = new int[a.length]; for (int i = a.length - 1; i >= 0; i--) { if (w <= 0) { c[i] = b[i] - a[i] - digit; if (c[i] >= 0) digit = 0; else { c[i] = c[i] + 10; digit = 1; } } else { c[i] = a[i] - b[i] - digit; if (c[i] >= 0) digit = 0; else { c[i] = c[i] + 10; digit = 1; } } } return c; } public static void main(String[] args) { int a[] = new int[50]; int b[] = new int[50]; int m = 0; int n = 0; int s = 0; int t = 0; int w = 0; BufferedReader buf = new BufferedReader( new InputStreamReader(System.in)); try { System.out.print("请输入大数X:"); String X = buf.readLine(); System.out.print("请输入大数Y:"); String Y = buf.readLine(); m = a.length - X.length(); n = b.length - Y.length(); // 判断两个大数的大小 if (X.length() > Y.length()) w = 1; else if (X.length() < Y.length()) w = -1; else w = X.compareTo(Y); // 转化为数组 for (int i = 0; i < X.length(); i++) { a[m++] = X.charAt(i) - 48; } for (int j = 0; j < Y.length(); j++) { b[n++] = Y.charAt(j) - 48; } // 加法运算 int[] c = BigNumber.add(a, b); // 截取前面多余的0 for (int k = 0; k < c.length; k++) { if (c[k] > 0) { s = k; break; } } // 输出大数相加的结果 System.out.print("大数相加的结果为:"); for (int i = s; i < c.length; i++) { System.out.print(c[i]); } System.out.println(); // 减法运算 int[] d = BigNumber.sub(a, b, w); for (int k = 0; k < d.length; k++) { if (d[k] > 0) { t = k; break; } } System.out.print("大数相减的结果为:"); if (w < 0) System.out.print("-"); for (int i = t; i < d.length; i++) { System.out.print(d[i]); } System.out.println(); System.out.println(); System.out.println(); System.out.println(); } catch (IOException e) { e.printStackTrace(); } }} 求大数的阶乘import java.io.IOException;public class Array { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int Data[] = new int[40]; int Digit; int i, j, r, k; int n = 0; for (i = 1; i < 40; i++) { Data[i] = 0; } Data[0] = 1; Data[1] = 1; Digit = 1; System.out.println("please input int number"); try { n = System.in.read(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // int a=System.in.read(); for (i = 1; i < n + 1; i++) { for (j = 1; j < Digit + 1; j++) Data[j] *= i; for (j = 1; j < Digit + 1; j++) { if (Data[j] > 10) { for (r = 1; r < Digit + 1; r++) { if (Data[Digit] > 10) Digit++;// Data[r + 1] += Data[r] / 10; Data[r] = Data[r] % 10; } } } } System.out.print(i + "!="); for (k = Digit; k > 0; k--) System.out.print(Data[k]); System.out.println(""); }} import java.util.*;import java.io.*;import java.math.*;public class AddBigInterger { public static void main(String[] args) throws IOException{ LinkedList<Integer> a=new LinkedList<Integer>(); LinkedList<Integer> b=new LinkedList<Integer>(); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); System.out.println("input a:"); String num1=br.readLine(); System.out.println("input b:"); String num2=br.readLine(); //测试我的答案: BigInteger b1=new BigInteger(num1); BigInteger b2=new BigInteger(num2); System.out.println("标准答案:"); System.out.println(b1.add(b2)); //按4位断开分别放置到链表中 for(int index=0;index<num1.length();){ if(a.size()==0 && num1.length()%4!=0){ a.add(Integer.parseInt(num1.substring(0,num1.length()%4))); index+=num1.length()%4; } else{ if(index!=0) a.addFirst(Integer.parseInt(num1.substring(index, index+4))); else a.add(Integer.parseInt(num1.substring(index, index+4))); index+=4; } } for(int index=0;index<num2.length();){ if(b.size()==0 && num2.length()%4!=0){ b.add(Integer.parseInt(num2.substring(0,num2.length()%4))); index+=num2.length()%4; } else{ if(index!=0) b.addFirst(Integer.parseInt(num2.substring(index, index+4))); else b.add(Integer.parseInt(num2.substring(index, index+4))); index+=4; } } // System.out.println(a);// System.out.println(b); List<Integer> c=add(a,b); StringBuilder result=new StringBuilder(); for(int i:c) result.append(String.format("%04d",i)); int index; for(index=0;index<result.length();index++) if(result.charAt(index)!='0') break; System.out.println("我的答案:"); System.out.println(result.delete(0,index).toString()); } /* * 模拟大整数加法,以1000为进率。 */ public static List add(LinkedList<Integer> a,LinkedList<Integer> b){ int cf=0,i;//cf为进位 LinkedList<Integer> result=new LinkedList<Integer>(); for(i=0;i<a.size()&&i<b.size();i++){ int t=a.get(i)+b.get(i)+cf; cf=t/10000; if(i!=0) result.addFirst(t%10000); else result.add(t%10000); } if(a.size()>b.size()){ while(i<a.size()){ int t=a.get(i)+cf; cf=t/10000; result.addFirst(t%10000); i++; } } else{ while(i<b.size()){ int t=b.get(i)+cf; cf=t/10000; result.addFirst(t%10000); i++; } } while(cf!=0){ result.addFirst(cf%10000); cf/=10000; } return result; }} 在这个 地方 有错 System.out.print(i + "!=");应该是 System.out.print(n + "!=");是求n的阶乘 就是在java中使用数组实现大数的运算(因为大数用普通的int long 等根本就用不了),主要是乘法。 关于内部类以及函数的思考 我真心请教大家这个问题 java获取html的问题 socket 问题 偶如何能实现java精确打印 java开发工具的一些问题 谁用java作过his?高分赠送! applet能读写本地(工作站)的文件吗? 最大的网上电脑书籍专卖店开张了 求助 多大的java类算大 判断(数据库的)一个表是否为空 不为空则输出内容 为空则插入数据
http://datafans.blog.163.com/blog/static/8572788420094232462909/
我给你给个我原来在OJ上写的个大数相加,相乘也一样,除法就是减法,小数部分就是添0再减,直到自己要的精度为止.#include<stdio.h>
#include<string.h>
#define MAX 2000
int Add(char a[],char b[],int x)
{
int i,flag;
int add;
for(i=MAX-1;i>=MAX-x;--i)
{
add=a[i]-'0'+b[i]-'0';
if(add>=10)
{
a[i]=add-10+'0';
a[i-1]+=1;
flag=1;
}
else
{
a[i]=add+'0';
flag=0;
}
}
if(flag)
{
++x;
}
return x;
}
int main(void)
{
char a[MAX],b[MAX];
int k,z,n;
int x,y,m;
for(k=0;k<MAX;++k)
{
a[k]='0';
b[k]='0';
}
m=scanf("%s %s",a,b);
while(m==2)
{
x=strlen(a);
y=strlen(b);
z=x>y?x:y;
a[x]='0';
b[y]='0';
for(k=1;k<=x;++k)
{
a[MAX-k]=a[x-k];
}
for(k=1;k<=y;++k)
{
b[MAX-k]=b[y-k];
}
n=Add(a,b,z);
for(k=MAX-n;k<MAX;++k)
{
printf("%c",a[k]);
}
printf("\n"); for(k=0;k<MAX;++k)
{
a[k]='0';
b[k]='0';
}
m=scanf("%s %s",a,b); }
return 0;
}
import java.io.IOException;
import java.io.InputStreamReader;public class BigNumber {
public static int[] add(int[] a, int[] b) {
int digit = 0;
int[] c = new int[a.length];
for (int i = a.length - 1; i >= 0; i--) {
c[i] = a[i] + b[i] + digit;
if (c[i] < 10)
digit = 0;
else {
c[i] = c[i] - 10;
digit = 1;
}
}
return c;
} public static int[] sub(int[] a, int[] b, int w) {
int digit = 0;
int[] c = new int[a.length];
for (int i = a.length - 1; i >= 0; i--) {
if (w <= 0) {
c[i] = b[i] - a[i] - digit;
if (c[i] >= 0)
digit = 0;
else {
c[i] = c[i] + 10;
digit = 1;
}
} else {
c[i] = a[i] - b[i] - digit;
if (c[i] >= 0)
digit = 0;
else {
c[i] = c[i] + 10;
digit = 1;
}
}
}
return c;
} public static void main(String[] args) {
int a[] = new int[50];
int b[] = new int[50];
int m = 0;
int n = 0;
int s = 0;
int t = 0;
int w = 0;
BufferedReader buf = new BufferedReader(
new InputStreamReader(System.in));
try {
System.out.print("请输入大数X:");
String X = buf.readLine();
System.out.print("请输入大数Y:");
String Y = buf.readLine(); m = a.length - X.length();
n = b.length - Y.length(); // 判断两个大数的大小
if (X.length() > Y.length())
w = 1;
else if (X.length() < Y.length())
w = -1;
else
w = X.compareTo(Y); // 转化为数组
for (int i = 0; i < X.length(); i++) {
a[m++] = X.charAt(i) - 48;
} for (int j = 0; j < Y.length(); j++) {
b[n++] = Y.charAt(j) - 48;
} // 加法运算
int[] c = BigNumber.add(a, b); // 截取前面多余的0
for (int k = 0; k < c.length; k++) {
if (c[k] > 0) {
s = k;
break;
}
} // 输出大数相加的结果
System.out.print("大数相加的结果为:");
for (int i = s; i < c.length; i++) {
System.out.print(c[i]);
} System.out.println(); // 减法运算
int[] d = BigNumber.sub(a, b, w);
for (int k = 0; k < d.length; k++) {
if (d[k] > 0) {
t = k;
break;
}
}
System.out.print("大数相减的结果为:");
if (w < 0)
System.out.print("-");
for (int i = t; i < d.length; i++) {
System.out.print(d[i]);
}
System.out.println();
System.out.println();
System.out.println();
System.out.println();
} catch (IOException e) { e.printStackTrace();
}
}}
public class Array { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int Data[] = new int[40];
int Digit;
int i, j, r, k;
int n = 0;
for (i = 1; i < 40; i++) {
Data[i] = 0;
}
Data[0] = 1;
Data[1] = 1;
Digit = 1;
System.out.println("please input int number");
try {
n = System.in.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// int a=System.in.read();
for (i = 1; i < n + 1; i++) {
for (j = 1; j < Digit + 1; j++)
Data[j] *= i;
for (j = 1; j < Digit + 1; j++) {
if (Data[j] > 10) {
for (r = 1; r < Digit + 1; r++) {
if (Data[Digit] > 10)
Digit++;//
Data[r + 1] += Data[r] / 10;
Data[r] = Data[r] % 10;
}
}
}
}
System.out.print(i + "!=");
for (k = Digit; k > 0; k--)
System.out.print(Data[k]);
System.out.println("");
}
}
import java.io.*;
import java.math.*;
public class AddBigInterger {
public static void main(String[] args) throws IOException{
LinkedList<Integer> a=new LinkedList<Integer>();
LinkedList<Integer> b=new LinkedList<Integer>();
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
System.out.println("input a:");
String num1=br.readLine();
System.out.println("input b:");
String num2=br.readLine();
//测试我的答案:
BigInteger b1=new BigInteger(num1);
BigInteger b2=new BigInteger(num2);
System.out.println("标准答案:");
System.out.println(b1.add(b2));
//按4位断开分别放置到链表中
for(int index=0;index<num1.length();){
if(a.size()==0 && num1.length()%4!=0){
a.add(Integer.parseInt(num1.substring(0,num1.length()%4)));
index+=num1.length()%4;
}
else{
if(index!=0)
a.addFirst(Integer.parseInt(num1.substring(index, index+4)));
else a.add(Integer.parseInt(num1.substring(index, index+4)));
index+=4;
}
}
for(int index=0;index<num2.length();){
if(b.size()==0 && num2.length()%4!=0){
b.add(Integer.parseInt(num2.substring(0,num2.length()%4)));
index+=num2.length()%4;
}
else{
if(index!=0)
b.addFirst(Integer.parseInt(num2.substring(index, index+4)));
else b.add(Integer.parseInt(num2.substring(index, index+4)));
index+=4;
}
}
// System.out.println(a);
// System.out.println(b);
List<Integer> c=add(a,b);
StringBuilder result=new StringBuilder();
for(int i:c)
result.append(String.format("%04d",i));
int index;
for(index=0;index<result.length();index++)
if(result.charAt(index)!='0') break;
System.out.println("我的答案:");
System.out.println(result.delete(0,index).toString());
}
/*
* 模拟大整数加法,以1000为进率。
*/
public static List add(LinkedList<Integer> a,LinkedList<Integer> b){
int cf=0,i;//cf为进位
LinkedList<Integer> result=new LinkedList<Integer>();
for(i=0;i<a.size()&&i<b.size();i++){
int t=a.get(i)+b.get(i)+cf;
cf=t/10000;
if(i!=0)
result.addFirst(t%10000);
else result.add(t%10000);
}
if(a.size()>b.size()){
while(i<a.size()){
int t=a.get(i)+cf;
cf=t/10000;
result.addFirst(t%10000);
i++;
}
}
else{
while(i<b.size()){
int t=b.get(i)+cf;
cf=t/10000;
result.addFirst(t%10000);
i++;
}
}
while(cf!=0){
result.addFirst(cf%10000);
cf/=10000;
}
return result;
}
}
应该是 System.out.print(n + "!=");
是求n的阶乘