一个数学问题,编程解决,求!也看看大家的数学能力! feiyuegaoshan(飞跃)飞跃,我到开始崇拜你了:)如果小数字计算生成巨大结果的,那好解决。现在在是巨大数据做巨大计算生成巨巨大结果。Oh,天哪,那是多大的数字啊。2003个4 没办法用数字类型表示只能用字符串了。怎么计算呢? 还是数学上的问题。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 做个大数的类,里面每隔一段都用一个int或者long型来表示把数学运算方法实现,实现进位等等最后,就利用这个类去解决这种巨大数据的问题吧 本来我还想做做呢正在逼近答案已经出来了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; } } }}这么算得算多久 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,直到运行结束。核心思想就是:模拟进位计算。可能有些具体细节还得考虑,但大致轮廓肯定是这样的。上初中的时候第一次接触这样的问题,觉得很有趣。现在很少写了。不可否认,这样的问题解决多了,大学计算机课程一大半都可以自学了。计算机系的大学课程很多都是浪费时间,浪费学生青春。说多了:)祝大家愉快:)睡午觉去了:) 这个其实也不是太难算啦,用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:12678210818510677891955466592902962181235581303675955014455123833656852839629242615881422949873891953353012489818943522670343236590402030258667646034639780010260222994777145283996043943343564940889298941605687795305139364771764069624617191937469187240662788558114103227088570199941239788304280221797440312754289075263319459351101969574178411918756670759212418572030912208996831868742917955644798254634212378560215416119693481220536391522974306683571838646855242935268293865193068969599277556614843507471186176778402069895779852917128410381366691326327297961456667157223256309592182073952607269489870282376893593818267985769581729309448400087132666730385630873975119379627889075345420192969446887720515441759093012919580310317681375470912439146521469954161736896940773957131988542163486466719925568250639021905283424197645767433178347808230637282535958375008357990346330355006663135922932689097744364709815666653075489560201457136812522445089719300715532191677196347718110142641754962559934565637395717506802.1117869493863929795616520943053767620302217259809645128740917282698033846790306959514752239294614291 厄~不会溢出吧~呵呵感觉和那个费波拉契的计算有的一拚了~hoho~~ 题目是求4444444444......4(总共2003个)的平方根,我的算法里面就是不断逼近算出 current.multiply(current)逐渐逼近最后结果的值这个current当然就是finalResult的平方根啊 我说的是feiyuegaoshan(飞跃)的算法弄错意思了 后天笔试去,问个问题,顺便散分,祝我好运 有没有一切java比较给力的游戏代码 请问java中所有的抽象类都要用 implements吗? 关于this Java虚拟机崩溃,什么原因 面试题一道!大家看看有什么好的算法! 关于java.lang.Class.getMethod(String name,Class[] parameterTypes) 请教,c是一个数组。我用a.b(c)传参怎么出错。不能这样传吗? 请问在哪里可以下载到Tomcat最新的版本, java访问数据库不能成功 请问如何把数据库的blob对象写入一个文件? javamail发送有图片的html问题,(多张图片)
把数学运算方法实现,实现进位等等
最后,就利用这个类去解决这种巨大数据的问题吧
正在逼近
答案已经出来了
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;
}
}
}}这么算得算多久
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,直到运行结束。核心思想就是:模拟进位计算。可能有些具体细节还得考虑,但大致轮廓肯定是这样的。
上初中的时候第一次接触这样的问题,觉得很有趣。现在很少写了。
不可否认,这样的问题解决多了,大学计算机课程一大半都可以自学了。
计算机系的大学课程很多都是浪费时间,浪费学生青春。说多了:)
祝大家愉快:)
睡午觉去了:)
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
我的算法里面就是不断逼近算出 current.multiply(current)逐渐逼近最后结果的值
这个current当然就是finalResult的平方根啊