数据超过“长”的长度

时间:2017-03-23 06:52:38

标签: java android

问题:人A在第一天给人B $ 1,金额每天翻倍。人员B在100天后得到多少钱?

import java.text.NumberFormat;

long x = 1;
int y = 1;
for(int p = 1; p <= 100; p++){
String o = NumberFormat.getIntegerInstance().format(x);
System.out.println("Day " + y + " gets " + o);
x = x * 2;
y = y + 1:
}

输出:

Day 1 gets 1
Day 2 gets 2
Day 3 gets 4
Day 4 gets 8
Day 5 gets 16
Day 6 gets 32
Day 7 gets 64
Day 8 gets 128
Day 9 gets 256
Day 10 gets 512
Day 11 gets 1,024
Day 12 gets 2,048
Day 13 gets 4,096
Day 14 gets 8,192
Day 15 gets 16,384
Day 16 gets 32,768
Day 17 gets 65,536
Day 18 gets 131,072
Day 19 gets 262,144
Day 20 gets 524,288
Day 21 gets 1,048,576
Day 22 gets 2,097,152
Day 23 gets 4,194,304
Day 24 gets 8,388,608
Day 25 gets 16,777,216
Day 26 gets 33,554,432
Day 27 gets 67,108,864
Day 28 gets 134,217,728
Day 29 gets 268,435,456
Day 30 gets 536,870,912
Day 31 gets 1,073,741,824
Day 32 gets 2,147,483,648
Day 33 gets 4,294,967,296
Day 34 gets 8,589,934,592
Day 35 gets 17,179,869,184
Day 36 gets 34,359,738,368
Day 37 gets 68,719,476,736
Day 38 gets 137,438,953,472
Day 39 gets 274,877,906,944
Day 40 gets 549,755,813,888
Day 41 gets 1,099,511,627,776
Day 42 gets 2,199,023,255,552
Day 43 gets 4,398,046,511,104
Day 44 gets 8,796,093,022,208
Day 45 gets 17,592,186,044,416
Day 46 gets 35,184,372,088,832
Day 47 gets 70,368,744,177,664
Day 48 gets 140,737,488,355,328
Day 49 gets 281,474,976,710,656
Day 50 gets 562,949,953,421,312
Day 51 gets 1,125,899,906,842,624
Day 52 gets 2,251,799,813,685,248
Day 53 gets 4,503,599,627,370,496
Day 54 gets 9,007,199,254,740,992
Day 55 gets 18,014,398,509,481,984
Day 56 gets 36,028,797,018,963,968
Day 57 gets 72,057,594,037,927,936
Day 58 gets 144,115,188,075,855,872
Day 59 gets 288,230,376,151,711,744
Day 60 gets 576,460,752,303,423,488
Day 61 gets 1,152,921,504,606,846,976
Day 62 gets 2,305,843,009,213,693,952
Day 63 gets 4,611,686,018,427,387,904
Day 64 gets -9,223,372,036,854,775,808
Day 65 gets 0
Day 66 gets 0
Day 67 gets 0
Day 68 gets 0
Day 69 gets 0
Day 70 gets 0
Day 71 gets 0
Day 72 gets 0
Day 73 gets 0
Day 74 gets 0
Day 75 gets 0
Day 76 gets 0
Day 77 gets 0
Day 78 gets 0
Day 79 gets 0
Day 80 gets 0
Day 81 gets 0
Day 82 gets 0
Day 83 gets 0
Day 84 gets 0
Day 85 gets 0
Day 86 gets 0
Day 87 gets 0
Day 88 gets 0
Day 89 gets 0
Day 90 gets 0
Day 91 gets 0
Day 92 gets 0
Day 93 gets 0
Day 94 gets 0
Day 95 gets 0
Day 96 gets 0
Day 97 gets 0
Day 98 gets 0
Day 99 gets 0
Day 100 gets 0

你可以看到,在第64天,数字变为负数,在第64天后,数字变为0。

如何在第100天获得金额? “long”是我所知道的最大数据类型。

2 个答案:

答案 0 :(得分:2)

您可能必须切换到使用Java的BigInteger类。

这里有一些文档:http://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html

基本上,BigInteger可以容纳的数字大于CPU上可以容纳的寄存器 - 这可能比很长。

此外,您不需要跟踪y,因为它的值将始终与p的值相同。

import java.math.BigInteger;
import java.text.NumberFormat;

public class MyClass 
{
  public static void main(String[] args)
  {
    BigInteger x = BigInteger.ONE;
    BigInteger two = BigInteger.valueOf(2L);
    NumberFormat nf = NumberFormat.getInstance();

    for(int p = 1; p <= 100; p++)
    {
      String o = nf.format(x);
      System.out.println("Day " + p + " gets " + o);
      x = x.multiply(two);
    }

  }
}

注意:对于乘以2,x.shiftLeft(1)的效率高于x.multiply(two)。您可以考虑将x = x.multiply(...)替换为x = x.shiftLeft(1);

答案 1 :(得分:0)

BigInteger day64 = new BigInteger(whatever the number);
BigIneger day65 = day64.add(day64);
像那样的Smth。

您可以编辑代码以适应循环,而不必每天输入。

相关问题