哪位JAVA高手帮忙看一下下面的这个程序。

题目是:编写一个类,类中有一个方法,有一个参数(intnum),能够输出从0到num的所有完数。(完数指的事一个数恰好等于它的因子之和这个数就是完数,例如:6=1+2+3... 题目是: 编写一个类,类中有一个方法,有一个参数(int num),能够输出从0到num的所有完数。(完数指的事一个数恰好等于它的因子之和这个数就是完数,例如:6=1+2+3)
PS:我觉得我这个应该是数组那里出了问题。

public class Wanshu {
//得到k所有因数个数
public int getyinshu(int k)
{ int num=0;
for(int i=1;i<=k-1;i++)
{
if(k%i==0) //判断因数
{
num++;
}
else{}
}
return num;

}
//将因数写入数组
public int[] zhuangshu(int i)
{
//创建数组
int t=getyinshu(i);
int[] arr=new int[t];//数组长度
//将i的因数写入数组
int tempt=0;
for(int k=1;k<=i-1;k++)
{
if(i%k==0)//如果i是因数
{
arr[tempt]=k;
tempt++;
}
else{}

}
return arr;

}

//将数组中的因数相加
public int yinshuxiangjia(int j)
{
int[] a=zhuangshu(j);//得到动态数组a

int sum=0;
for(int i=0;i<=a.length;i++)
{
sum=sum+a[i];
}
return sum;

}
//判断因数和是否和这个数相等(即这个数是否为完数),如果是则输出这个数
public void panduan(int i)
{ int m=yinshuxiangjia(i);
if(i==m)
{
System.out.println(i);
}
else{}
}

public static void main(String[] args)
{ Wanshu a=new Wanshu();
//System.out.println(a.getyinshu(6));

System.out.println(a.zhuangshu(6));

System.out.println(a.yinshuxiangjia(6));
}

}
展开
 我来答
百度网友845f74e61
2012-04-01 · TA获得超过6929个赞
知道大有可为答主
回答量:4050
采纳率:50%
帮助的人:1614万
展开全部
//将数组中的因数相加
public int yinshuxiangjia(int j)
{
int[] a=zhuangshu(j);//得到动态数组a
int sum=0;
for(int i=0;i<=a.length;i++)
{
sum=sum+a[i];
}
return sum;
}

这个方法有问题,数组是从0到n-1,你 i<=a.length 这样取a[n],时肯定是数组下标越界了,
改成i<a.length就可以了。

你的代码写了很多。创建 了一些数组,没细看,不清楚是做什么用的,下边是我给出的算法。
因子最大是n/2,这个你可以考虑一下,这样比你的循环数会少很多。
--------------------------------------------------------------------------------------

public class Wanshu {

public static void main(String[] args) {
int len = 1000;
for (int i = 1; i <= len; i++) {
if (isWanshu(i)) {
System.out.println(i);
}
}
}

public static boolean isWanshu(int n) {
int sum = 0;
for (int i = 1; i <= n / 2; i++) {
if (n % i == 0) {
sum += i;
}
}
return sum == n;
}
}
程序那点事
2012-04-01 · TA获得超过6140个赞
知道大有可为答主
回答量:3253
采纳率:59%
帮助的人:1329万
展开全部
public int yinshuxiangjia(int j) {
int[] a = zhuangshu(j);// 得到动态数组a

int sum = 0;
for (int i = 0; i <a.length; i++) {
sum = sum + a[i];
}
return sum;

}
不能等于
更多追问追答
追问
我也感觉是这里的问题,但是不会改,怎么把存进一维数组的数加起来呢
追答
你这样就已经加起来了啊 
问题不是加起来的问题 是你的循环索引
a数组的长度是3 你通过zhuangshu
int[] arr=new int[t];//数组长度
但是呢 如果你写等于 那么i的值可能是0,1,2,3
for (int i = 0; i <a.length; i++) {
sum = sum + a[i];
}
sum=sum+a[3] ,a数组里面只有0,1,2 所以数组下标越界
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
云中游民
2012-04-01 · TA获得超过602个赞
知道小有建树答主
回答量:697
采纳率:33%
帮助的人:616万
展开全部
你这个太麻烦啦,给你换个简单的
public static void main(String[] args) {
int num=1000;
getPerfectNumBetween(1,num);
}

private static void getPerfectNumBetween(int min, int max) {
if(min<=0||max<=0||max<min)//默认不带0玩的
return;
StringBuilder sb = new StringBuilder();
sb.append("the perfect number between "+min+" and "+max+" is :\n" );
for(int i=0;i<max-min;i++){
if(isPerfectNum(min+i)){
sb.append(" "+(min+i)+" ");
}
}
System.out.println(sb.toString());
}

private static boolean isPerfectNum(int num) {
int sum=1;//1是所有数的公因数
for(int i=2;i<=num/2;i++){//注意条件
if(num%i==0){
sum+=i;
if(sum>num){//超过num
return false;
}
}
}
return num==sum;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
why213344
2012-04-01
知道答主
回答量:21
采纳率:0%
帮助的人:12.2万
展开全部
for(int i=0;i<=a.length;i++){
sum=sum+a[i];
}

这里错了。下标从0开始,不包括length i<a.length 就行了,不能在等于了,数组下标越界了。
else{} 没有内容,咱就略了吧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
qifengzhang87
2012-04-01
知道答主
回答量:34
采纳率:0%
帮助的人:11.1万
展开全部
楼上正解,数组长度是a.Length; 但可访问的数组下标是啊a[0]----a[a.Length-1];
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xuehe363
2012-04-01
知道答主
回答量:9
采纳率:0%
帮助的人:1.5万
展开全部
算法很生僻
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式