哪位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));
}
} 展开
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));
}
} 展开
6个回答
展开全部
//将数组中的因数相加
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;
}
}
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;
}
}
展开全部
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;
}
不能等于
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 所以数组下标越界
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你这个太麻烦啦,给你换个简单的
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;
}
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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
for(int i=0;i<=a.length;i++){
sum=sum+a[i];
}
这里错了。下标从0开始,不包括length i<a.length 就行了,不能在等于了,数组下标越界了。
else{} 没有内容,咱就略了吧。
sum=sum+a[i];
}
这里错了。下标从0开始,不包括length i<a.length 就行了,不能在等于了,数组下标越界了。
else{} 没有内容,咱就略了吧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
楼上正解,数组长度是a.Length; 但可访问的数组下标是啊a[0]----a[a.Length-1];
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询