java吧 关注:1,285,015贴子:12,810,224

回复:【java面试题】_______大数字计算

只看楼主收藏回复

直接问他答案就完了


来自Android客户端17楼2012-12-03 15:12
收起回复
    BigDecimal类


    IP属地:浙江18楼2012-12-03 15:22
    收起回复
      2025-10-29 17:34:24
      广告
      不感兴趣
      开通SVIP免广告
      自己写一个类完事


      IP属地:广东19楼2012-12-03 15:29
      收起回复
        我们老师刚教过,不过那是一百个1+一百个2,,,,我们老师用字符串做的


        IP属地:河南20楼2012-12-03 15:35
        收起回复
          用数组,比如说long类型的数据最多能算19位还是多少位的,你用数组,超过某个位数就进位(比如15位)到下一个元素上。


          IP属地:江苏21楼2012-12-03 15:37
          收起回复
            如果仅仅是这题,不考虑扩展性问题,
            //大数字加法计算用方法(返回数组)num1:数字1,num2:数字2,weishu:进位用位数
            public static long[] bigNumSum(String num1,String num2,int weishu)
            {
            long[]numArray1=arrayChange(num1,weishu);
            long[]numArray2=arrayChange(num2,weishu);
            int length1=numArray1.length;
            int length2=numArray2.length;
            long[]result=null;
            //谨慎起见,多放一位
            if(length1>length2)
            result=new long[length1+1];
            else
            result=new long[length2+1];
            for(int i=0;i<length1;i++)
            {
            result[i]=numArray1[i];
            }
            for(int i=0;i<length2;i++)
            {
            result[i]=result[i]+numArray2[i];
            result=jinwei(result, weishu);
            }
            return result;
            }
            //字符串转换到数组,num:可转换为数字的字符串,weishu:数组进位规则
            public static long[] arrayChange(String num,int weishu)
            {
            int length=num.length();
            int temp=(length/weishu)+1;
            long[] numArray=new long[temp];
            for(int i=0;i<temp;i++)
            {
            if(weishu*(i+1)-1<length)
            numArray[i]=Long.valueOf(num.substring(weishu*i, weishu*(i+1)-1));
            else
            numArray[i]=Long.valueOf(num.substring(weishu*i, length));
            }
            long[]result=new long[temp];
            //由于我的数组是从低位到高位的,
            //即假如第10位进位的数组,数字是10000001002,数组结构实际上是1002,1,
            //所以最后要反转一下
            for(int i=0;i<temp;i++)
            {
            result[i]=numArray[temp-i-1];
            }
            return result;
            }
            //进位用方法:a:计算用的数组,weishu:多少位开始就进位
            public static long[] jinwei(long[] a,int weishu)
            {
            int i=a.length;
            long panduan=1;
            for(int j=0;j<weishu;j++)
            panduan=panduan*10;
            for(int k=0;k<i-1;k++)
            {
            if(a[k]>=panduan)
            {
            a[k+1]=a[k+1]+a[k]/panduan;
            a[k]=a[k]%panduan;
            }
            }
            return a;
            }
            //打印结果用方法,a:计算用数组,weishu:多少位开始就进位
            public static void printresult(long[] a,int weishu)
            {
            int i=a.length;
            int index=0;
            String[] result=new String[i];
            for(int j=0;j<i;j++)
            result[j]=String.valueOf(a[j]);
            boolean iscanaddzero=false;
            for(int j=i-1;j>=0;j--)
            {
            if(!iscanaddzero&&!result[j].equals("0"))
            {
            iscanaddzero=true;
            continue;
            }
            if(result[j].length()<weishu&&j!=i-1&&!result[j].equals("0")&&iscanaddzero)
            {
            for(int k=0;k<weishu-result[j].length();k++)
            result[j]="0"+result[j];
            }
            }
            for(int j=i-1;j>=0;j--)
            {
            if(!result[j].equals("0"))
            {
            index=j;
            break;
            }
            }
            //需要补0的地方补0
            for(int j=index-1;j>=0;j--)
            {
            if(result[j].equals("0"))
            {
            for(int k=0;k<weishu-1;k++)
            result[j]=result[j]+"0";
            }
            }
            for(int j=i-1;j>=0;j--)
            {
            if(!result[j].equals("0"))
            System.out.print(result[j]);
            }
            }
            然后再主方法里写下如下代码:
            String temp1="42342348923840239840239840923842380";
            String temp2="80948502350237598347598347589347507";
            long[]resultArray=bigNumSum(temp1, temp2, 15);
            printresult(resultArray, 15);
            ps:temp1,temp2可以修改,不过我的方法比较简陋,只考虑了两个数都是正数的情况。


            IP属地:江苏22楼2012-12-03 16:24
            收起回复
              写一个递归可以不-。-
              模拟加法一位位的来


              23楼2012-12-03 16:34
              收起回复
                表示正在学习JAVA!正在入门,还没有进去呢


                24楼2012-12-03 16:40
                收起回复
                  2025-10-29 17:28:24
                  广告
                  不感兴趣
                  开通SVIP免广告
                  以前想过这个问题,没实现成功。正好看一下楼上的大神解答


                  25楼2012-12-03 18:37
                  收起回复
                    数组呗
                    多简单


                    IP属地:河南来自iPhone客户端26楼2012-12-03 18:41
                    收起回复
                      用数组、链表或字符串都行


                      IP属地:浙江27楼2012-12-03 18:56
                      收起回复

                        public class Test {
                        public static void main(String[] args) {
                        String str1 = "123456789012345678901234567890";
                        String str2 = "123456789012345678901234567890";
                        int f = 2;
                        int t = 2;
                        int num1[] = new int[str1.length() + 1];
                        int num2[] = new int[str2.length() + 1];
                        String str1s[] = str1.split("");


                        IP属地:河南29楼2012-12-03 20:36
                        回复
                          String str2s[] = str2.split("");
                          for (int i = 1; i < str1s.length; i++) {
                          num1[i] = Integer.parseInt(str1s[i]);
                          num2[i] = Integer.parseInt(str2s[i]);
                          }
                          for (int i = num1.length - 1; i >= 0; i--) {
                          if ((num1[i] + num2[i]) >= 10) {


                          IP属地:河南30楼2012-12-03 20:36
                          回复
                            int temp = (num1[i] + num2[i]) - 10;
                            num1[i] = temp;
                            num1[i-1]++;
                            } else {
                            num1[i] = num1[i] + num2[i];
                            }
                            }
                            for (int i = 0; i < num1.length; i++) {
                            System.out.print(num1[i]);
                            }
                            }
                            }


                            IP属地:河南31楼2012-12-03 20:36
                            回复