首页 新闻 会员 周边

关于一个面试题,设计一个100亿的计算器。

0
悬赏园豆:10 [待解决问题]

网上搜的答案是自己写了个biginteger的类,但是为什么不用long呢?是因为效率的问题吗?没感觉对效率有什么影响!

package com.wjl.test;

public class BigInteger {
    /**
     * 用int来表示符号
     * byte[]来表示其中的二进制数
     * */
    int sign;
    byte[] val;
    public BigInteger(String val){
        sign=0;
        val=null;
    }
    /**
     * 下面是加减乘除的各个方法!
     * 恕我没有看懂!
     * 上面的一个构造函数是如何表示出属于一百亿以内的任何数字的!!!!!
     * */
}
优质代码的主页 优质代码 | 初学一级 | 园豆:192
提问于:2013-11-18 10:55
< >
分享
所有回答(5)
0
平常心队长 | 园豆:1113 (小虾三级) | 2013-11-18 11:01
0
下面是我以前写的一个计算长数据的计算器的一部分,原则上,可以计算任意大的数据,只是时间可能会稍长,比如计算1024的1024次方开10个线程计算需要3分钟多的,当然我只给了你加法,其它的你自己按小学课本上的减乘除的方法计算就行了。
//
这是一个长数据类 public class LongNumber { public NumberFlag Flag { get; set; } public string Number { get; set; } public LongNumber() { this.Flag = NumberFlag.Zero; this.Number = "0"; } public LongNumber(string number) { if (!LongNumber.CheckNumber(number)) throw new InvalidCastException("Input not is a number."); this.Flag = NumberFlag.Positive; this.Number = number; } public LongNumber(NumberFlag flag, string number) { if (!LongNumber.CheckNumber(number)) throw new InvalidCastException("Input not is a number."); this.Flag = flag; this.Number = number; } public override string ToString() { if (LongNumber.EqualsZero(this)) return "0"; else { return string.Format("{0}{1}", this.Flag == NumberFlag.Positive ? string.Empty : "-", this.Number.TrimStart('0')); } } public static bool CheckNumber(string a) { if (string.IsNullOrWhiteSpace(a)) return false; var content = a; foreach (var item in content) { if (!"0123456789.".Contains(item)) { return false; } } return true; } public static bool EqualsZero(LongNumber a) { foreach (var item in a.Number) { if (!"0.".Contains(item)) { return false; } } return true; } } public enum NumberFlag { Negative, Zero, Positive } }
/// <summary>
        /// 比较两个长整数的大小
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <returns></returns>
        private int Compare(LongNumber a, LongNumber b)
        {
            //格式化数据
            var inputA = a.Number;
            var inputB = b.Number;
            FormatNumber(ref inputA, ref inputB);
            a.Number = inputA;
            b.Number = inputB;

            var flagA = NumberFlag.Zero;
            var flagB = NumberFlag.Zero;

            if (!LongNumber.EqualsZero(a))
                flagA = a.Flag;

            if (!LongNumber.EqualsZero(b))
                flagB = b.Flag;

            if (flagA == NumberFlag.Zero && flagB == NumberFlag.Zero)
            {
                return 0;
            }

            if (flagA > flagB)
                return 1;
            else if (flagA < flagB)
                return -1;
            else
            {
                for (var i = 0; i < a.Number.Length; i++)
                {
                    var itemA = int.Parse(a.Number[i].ToString());
                    var itemB = int.Parse(b.Number[i].ToString());

                    if (itemA == itemB)
                        continue;

                    if (itemA > itemB)
                        return 1;
                    else
                        return -1;
                }
                return 0;
            }
        }

        /// <summary>
        /// 获取小数位数
        /// </summary>
        /// <param name="a"></param>
        /// <returns></returns>
        private int getDecimalDigits(string a)
        {
            return a.IndexOf('.') >= 0 ? a.Length - a.IndexOf('.') - 1 : 0;
        }
/// <summary>
        /// 计算a加b的结果
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <returns></returns>
        private LongNumber Add(LongNumber a, LongNumber b)
        {
            //格式化数据
            var inputA = a.Number;
            var inputB = b.Number;
            FormatNumber(ref inputA, ref inputB);
            a.Number = inputA;
            b.Number = inputB;

            //定义进位值
            var carry = 0;
            var sbResult = new StringBuilder();
            for (var i = a.Number.Length - 1; i >= 0; i--)
            {
                var tempA = a.Number[i];
                var tempB = b.Number[i];

                if (tempA == '.')
                {
                    sbResult.Insert(0, tempA);
                    continue;
                }

                var tempResult = int.Parse(tempA.ToString()) + int.Parse(tempB.ToString()) + carry;
                if (tempResult > 9)
                {
                    carry = 1;
                    tempResult -= 10;
                }
                else
                {
                    carry = 0;
                }
                sbResult.Insert(0, tempResult.ToString());
            }

            if (carry > 0)
                sbResult.Insert(0, carry);

            return new LongNumber(sbResult.ToString());
        }
空明流光 | 园豆:106 (初学一级) | 2013-11-18 11:02
/// <summary>
        /// 往小数点后面的小数位末尾补0,在小数左边补零,以使两数左右对齐
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        private void FormatNumber(ref string a, ref string b)
        {
            //获取小数位数
            var aDecimalDigits = getDecimalDigits(a);
            var bDecimalDigits = getDecimalDigits(b);

            //补齐小数位数,使其右对齐
            var sb = new StringBuilder();
            for (var i = 0; i < Math.Abs(aDecimalDigits - bDecimalDigits); i++)
            {
                sb.Append('0');
            }
            if (aDecimalDigits > bDecimalDigits)
            {
                sb.Insert(0, b);
                b = sb.ToString();
            }
            else if (bDecimalDigits > aDecimalDigits)
            {
                sb.Insert(0, a);
                a = sb.ToString();
            }

            //补齐左边位数,使其可以左对齐
            sb.Clear();
            for (var i = 0; i < Math.Abs(a.Length - b.Length); i++)
            {
                sb.Append('0');
            }

            if (a.Length > b.Length)
            {
                sb.Append(b);
                b = sb.ToString();
            }
            else if (b.Length > a.Length)
            {
                sb.Append(a);
                a = sb.ToString();
            }
        }
支持(0) 反对(0) 空明流光 | 园豆:106 (初学一级) | 2013-11-18 11:07
0

你没有注意到100亿这个数字吗?

所有的数值类型都是有最大处理能力的。

比如Long应该只能最大到2147483648。

爱编程的大叔 | 园豆:30839 (高人七级) | 2013-11-18 11:03

long 是8位,64个字节,处理2的64次方

支持(0) 反对(0) 优质代码 | 园豆:192 (初学一级) | 2013-11-18 12:24

@优质代码: long 是 32 位,4 字节.即使是 long long ,它也是 64 位,8 字节,不是你说的"8 位,64个字节".不知道你是如何理解"位"和"字节"的.

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2013-11-18 13:28
0

看到这么大的数不可能想不到高精度。至于为什么是那样的代码,我只能告诉你这是在模拟人脑运算。请搞清楚高精度计算的含义

飞鸟_Asuka | 园豆:209 (菜鸟二级) | 2013-11-18 14:20
0

long装不下100亿

_cha1R | 园豆:403 (菜鸟二级) | 2013-11-18 17:54
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册