feiyuegaoshan(飞跃)飞跃,我到开始崇拜你了:)
如果小数字计算生成巨大结果的,那好解决。
现在在是巨大数据做巨大计算生成巨巨大结果。Oh,天哪,那是多大的数字啊。2003个4 没办法用数字类型表示只能用字符串了。怎么计算呢? 还是数学上的问题。

解决方案 »

  1.   

    做个大数的类,里面每隔一段都用一个int或者long型来表示
    把数学运算方法实现,实现进位等等
    最后,就利用这个类去解决这种巨大数据的问题吧
      

  2.   

    本来我还想做做呢
    正在逼近
    答案已经出来了
    import java.math.*;public class Untitled19 {
      public Untitled19() {
      }
      public static void main(String[] args) {
        Untitled19 untitled191 = new Untitled19();
        BigDecimal big4 = new BigDecimal(4);
        BigDecimal big1 = new BigDecimal(1);
        BigDecimal tmp4 = new BigDecimal(4);
        BigDecimal tmp2 = new BigDecimal(2);
        BigDecimal tmp3 = new BigDecimal(2);
        for (int i = 0; i < 2002; i++) {
          tmp4 = tmp4.multiply(new BigDecimal(10)).add(big4);
        }
        for (int i = 0; i < 1001; i++) {
          if (i == 0) {
            tmp2 = tmp2.multiply(new BigDecimal(10)).add(new BigDecimal(1));
          } else {
            tmp2 = tmp2.multiply(new BigDecimal(10)).add(new BigDecimal(0.5));
          }
        }
        for (int i = 0; i < 1001; i++) {
            tmp3 = tmp3.multiply(new BigDecimal(10)).add(new BigDecimal(1));
        }
        tmp2 = tmp2.setScale(0, tmp2.ROUND_DOWN);
        for (BigDecimal big = tmp2; big.compareTo(tmp3) < 0; big = big.add(new BigDecimal(1))) {
          BigDecimal mul = big.multiply(big);
          if (mul.equals(tmp4)) {
            System.out.println(mul);
            break;
          }
        }
      }}这么算得算多久
      

  3.   

    jokerjava(冷血) 的方法比直接算好多了,但也非常有限。我说个算法吧,具体实现看哪位有兴趣。
    1.用两个串strA,strB分别表示乘数,此处分别为2003个4。
    2.用数组c表示乘积,长度是2003*2003,用来保存计算结果。
    3.对strA每一位开始循环 pi。(注意从个位开始)
    4.对strB每一位开始循环 pj。(注意从个位开始)
    5.计算pc=pi*pj+p0
    其中,p0为上次循环计算所得的进位。
    6. pc % 10(取余数)存入数组c。
    7.p0 = pc / 10 (做取整处理)计算进位。
    8.走3,直到运行结束。核心思想就是:模拟进位计算。可能有些具体细节还得考虑,但大致轮廓肯定是这样的。
    上初中的时候第一次接触这样的问题,觉得很有趣。现在很少写了。
    不可否认,这样的问题解决多了,大学计算机课程一大半都可以自学了。
    计算机系的大学课程很多都是浪费时间,浪费学生青春。说多了:)
    祝大家愉快:)
    睡午觉去了:)
      

  4.   

    这个其实也不是太难算啦,用Java中的BigDecimal还是比较简单的。算小数点后100也就12秒多一点
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < 2003; i++) {
    sb.append('4');
    }
    BigDecimal finalResult = new BigDecimal(sb.toString());
    BigDecimal big = finalResult;
    BigDecimal small = BigDecimal.valueOf(1);
    BigDecimal current = small;BigDecimal one = small;
    BigDecimal two = BigDecimal.valueOf(2);
    int count = 0;
    long t1 = System.currentTimeMillis();while(true) {
    BigDecimal result = current.multiply(current);
    int res = result.compareTo(finalResult); 
    if(res < 0) {
    small = current;
    current = current.add(big).divide(two,100,BigDecimal.ROUND_HALF_UP);
    if(small.equals(current))
    break;
    } else if(res > 0) { 
    big = current;
    current = current.add(small).divide(two,100,BigDecimal.ROUND_HALF_UP);
    if(big.equals(current))
    break;
    } else
    break;
    }
    long t2 = System.currentTimeMillis();
    System.out.println("Run Time:" + (t2 - t1));
    System.out.println(small);Run Time:12678
    210818510677891955466592902962181235581303675955014455123833656852839629242615881422949873891953353012489818943522670343236590402030258667646034639780010260222994777145283996043943343564940889298941605687795305139364771764069624617191937469187240662788558114103227088570199941239788304280221797440312754289075263319459351101969574178411918756670759212418572030912208996831868742917955644798254634212378560215416119693481220536391522974306683571838646855242935268293865193068969599277556614843507471186176778402069895779852917128410381366691326327297961456667157223256309592182073952607269489870282376893593818267985769581729309448400087132666730385630873975119379627889075345420192969446887720515441759093012919580310317681375470912439146521469954161736896940773957131988542163486466719925568250639021905283424197645767433178347808230637282535958375008357990346330355006663135922932689097744364709815666653075489560201457136812522445089719300715532191677196347718110142641754962559934565637395717506802.1117869493863929795616520943053767620302217259809645128740917282698033846790306959514752239294614291
      

  5.   

    厄~不会溢出吧~呵呵感觉和那个费波拉契的计算有的一拚了~hoho~~
      

  6.   

    题目是求4444444444......4(总共2003个)的平方根,
    我的算法里面就是不断逼近算出 current.multiply(current)逐渐逼近最后结果的值
    这个current当然就是finalResult的平方根啊
      

  7.   

    我说的是feiyuegaoshan(飞跃)的算法弄错意思了