java 程序有哪里不对,结果不对

问题:
自然数的平方数是:1 4 9 16 25 …
自然数的立方数是:1 8 27 64 125 …
自然数的4次方数是:1 16 81256 …

这些数字都可以称为次方数。
1~10000中,去掉所有的次方数,还剩下多少个数字?
我就想问我的程序哪里思路不对

import java.util.Arrays;

public class Example5 {
public static void main(String args[]){
int i, j = 2, k = 0, add = 1, b = 0;
double a[] = new double [10000];
for(i = 2; Math.pow(i, j) < 10001; i ++){
for(j = 2; Math.pow(i, j) < 100001; j ++, k ++){
a[k] = Math.pow(i, j);
}
j = 2;
}
Arrays.sort(a);
for (i = b; i < a.length; i ++)
for(j = b + 1; j < a.length; j++)
if(a[i] != a[j]){
add = add + 1;
b = j;
break;
}
System.out.println("除去自然数在1~10000之间的次方数后,总数为" + (10000 - add));
}
}

    a[0] 的值是0 ,所以add的初始值应该设置0

    判断出来a[i]!=a[j]之后,从a[i]到a[j]的值都是相同的,这时候应该让 i=j-1;否则万一a[i+1]=a[i],这里判断的时候i从i+1开始,j却从上次结束的地方开始,结果就不符合了

追问

按你所说的修改。结果不对啊

追答

int i, j = 2, k = 0, add = 0, b = 0;
double a[] = new double [10000];
for(i = 2; Math.pow(i, j) < 10001; i ++){
for(j = 2; Math.pow(i, j) < 100001; j ++, k ++){
a[k] = Math.pow(i, j);
}
j = 2;
}
Arrays.sort(a);
System.out.println(a.length);
for (i = b; i < a.length; i ++)

for(j = b + 1; j < a.length; j++)
if(a[i] != a[j]){
add = add + 1;
// b = j;
i = j-1;
b=j;
System.out.println("["+i+"]"+a[i]+"--"+a[j]+"["+j+"]");
break;

}
System.out.println("除去自然数在1~10000之间的次方数后,总数为" + (10000 - add));
}

你试一下,结果是 9839吗?

追问

9875

追答

你看一下打印出来的数据,哪个是不符合的?

追问

求QQ,

追答

发现了 上面你写成了 1000001,不过改了之后我算出来结果是 9876

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-03-18
第一部分找出所有次方数为啥for(j = 2; Math.pow(i, j) < 100001; j ++, k ++){
这里是100001?而不是10001

第二部分检查数字在不在写得有点乱,但是你比较这个a这个次方数组的连续两位(b和b+1)是否一样有什么意义呀?

我觉得你第一步直接用个Set把数字放进去去重之后得到的数字就是次方数的数量,最后用10000减掉就可以了追问

第一部分是10001的,我写错的,因为第一部分的次方数有重复的,第二部分比较是否有相同的,我知道set可以,我就想试试这方法。第二部分的for前面进行了排序,如果有相同的,肯定在一起,所以可以进行比较,求QQ,。。

追答

public static void main(String[] args) {
int i, j = 2, k = 0, add = 1, b = 0;
double a[] = new double [10000];
Set set = new HashSet();
for(i = 2; Math.pow(i, j) < 10001; i ++){
for(j = 2; Math.pow(i, j) < 10001; j ++, k ++){
if (Math.pow(i,j) < 10001) {
set.add(Math.pow(i, j));
}
}
j = 2;
}
System.out.println("除去自然数在1~10000之间的次方数后,总数为" + (10000 - set.size() - 1));//额外排除掉1
// Arrays.sort(a);
// for (i = b; i < a.length; i ++)
// for(j = b + 1; j < a.length; j++)
// if(a[i] != a[j]){
// add = add + 1;
// b = j;
// break;
// }
}

在上班没有办法帮你仔细看了,调整一下你看看这个结果对不对

第2个回答  2014-03-18
看的很纠结,话说你添加进a[]的值有重复啊,你自己想想就应该知道,2^4和4^2结果都是16,你这代码会将这类数字重复添加追问

所以我下面用了一个排序,把相同的数凑在一起,然后用第二个for循环区分,但结果不对

第3个回答  2014-03-18
你既然觉得自己的代码有问题,就应该把注释加上去,不要让别人用正常的思维去猜你错误的代码的意图。
第4个回答  2014-03-18
是9875个么??追问

是啊。我想问我这程序为啥错啊,亲

追答package test;

import java.util.ArrayList;
import java.util.List;

public class Example5 {

public static void main(String[] args) {
// TODO Auto-generated method stub
int max = 10000;

List<Integer> list = new ArrayList<Integer>();

for(int i=1;i<10001;i++){
for(int j=2;j<10001;j++){
int result = (int) Math.pow(i, j);
if(result > 10000){
break;
}else if(!list.contains(result)){
list.add(result);
//System.out.println("i="+i+"\tj="+j+"\tresult="+result);
}
}
}

System.out.println(max-list.size());
}

}

追问

我知道有很多方法,我就想问下我的思路哪里错了,哥。。

相似回答