这是一道作业。因为普通的求法内容会溢出,无法正常输出。所以回答前务必确定能正常输出。提示可以用数组大神求教一下,这是老师布置的作业,用Math.pow()或for循环10万遍,都不能输出,int,long存不了那么大的数。我是初学者,求教怎么算。
7 回答
翻翻过去那场雪
TA贡献2065条经验 获得超14个赞
因为对于Java不熟悉,且没有Java环境,我给你一个思路,定义一个长度为10000的数字,2作为初值传入数组的最后一位,然后两层循环,第一层循环为10000次,内部循环为数组存入字符的内容循环,对于存入内容的数组,每一位*2,如果大于10,就将进位存入前一位数组即可。结果集可以直接打印数组或者转成字符串输出。 我本想提供计算结果的,但是长度太长,超出评论范围了,我给你下计算结果的长度,让你用来做验证,计算结果的长度为30103位。
慕工程0101907
TA贡献1887条经验 获得超5个赞
如果目的不是测试的,一种更基本的办法是用BigIneteger
。例如:
BigInteger.valueOf(2).pow(100_000);
侃侃无极
TA贡献2051条经验 获得超10个赞
实现了一个,但是效率不高:
import java.util.Arrays;
public class Application {
public static void main(String[] args) {
// 计算2的10万次方
int[] num = new int[]{1};
for (int i = 0; i < 100000; i++) {
//做10万次乘以2的计算
num = timesTwo(num);
}
System.out.println("result= "+Arrays.toString(num)
.replace(", ","")
.replace("[","")
.replace("]",""));
}
public static int[] timesTwo(int[] num) {
//对最新一个结果,从最低位开始每一位都乘以2,并存储其值
for (int i = num.length -1; i >= 0 ; i--) {
num[i] *= 2;
}
//从最低位开始检查每一位是否溢出,并处理溢出
for (int i = num.length -1; i >=0 ; i--) {//判断是否大于等于10
//如果溢出
if (num[i] >= 10) {
//设置当前位的值
num[i] -= 10;
//如果当前位刚好是最高位
if (i==0){
//扩大数组
int[] temp = new int[num.length+1];
//复制旧数组数据
System.arraycopy(num,0,temp,1,num.length);
//最高位为1
temp[0] = 1;
//引用新扩大后的数组
num = temp;
}else{
//当前位的左边一位加1
num[i-1] += 1;
}
}
}
return num;
}
}
白板的微信
TA贡献1883条经验 获得超3个赞
初学者被布置这样的作业,老师的意思应该不是让你自己实现一个方法。
import java.io.File;
import java.io.PrintStream;
import java.math.BigInteger;
public class A {
public static void main(String[] args) {
try {
String s = new BigInteger("2").pow(100000).toString();
//打印到d盘num.txt中,因为数字太长控制台打印不下
System.setOut(new PrintStream(new File("d:\\num.txt")));
System.out.print(s);
}
catch(Exception e){
e.printStackTrace();
}
}
}
添加回答
举报
0/150
提交
取消