求5000内的完美数。完美数可以表示为其所有真因子(除掉本身以外的约数)之和
例如6=1+2+3;
28=1+2+4+7+14;
496=1+2+4+8+16+31+62+124+248。

解决方案 »

  1.   


                int i, j, sum;
                for (i = 2; i < 5000; i++)
                {
                    sum = 0;
                    for (j = 1; j <= i / 2; j++)
                    {
                        if (i % j == 0)
                            sum = sum + j;
                    }
                    if (sum == i)
                        Console.WriteLine(sum);
                }
      

  2.   

            for (int i = 2; i <= 5000; i++)
            {
                for (int j = 1; j < i; j++)
                {
                    int sum = 0;
                    if (i % j == 0)
                    {
                        sum = j + sum;
                        if (sum > i) break;
                    }
                }
                if (sum == i) { Response.Write(i + "</br>"); }
            }
    这个和他的差不多,可以在网页上输出
      

  3.   

    第一个for i在2到5000之间,第二个for j在1到i/2(除本身以外的最大约数)之间,i % j == 0(j是i的余数),第二个for运行完后如果sum与i相等就是完美数,否则就不是,运行ctrl+F5
      

  4.   


    传入的是最小值和最大值,一个范围,返回你所需要的数据,看看这个行不行!!
    class Program
        {
            static void Main()
            {
                int[] resultList = GetPerfectNum(2, 50000);
                for (int i = 0; i < resultList.Length; ++i)
                {
                    Console.WriteLine(resultList[i]);
                }
                Console.WriteLine("Analyzer over");
                Console.ReadKey();
            }        static int[] GetPerfectNum(int min, int max)
            {
                List<int> resultList = new List<int>() ;
                for (int i = min; i <= max; ++i)
                {
                    int sum = 1 ;
                    for (int j = 2; j <= Math.Sqrt(i); ++j)
                    {
                        if (i % j == 0)
                        {
                            if (i / j != j)
                            {
                                sum += j;
                                sum += i / j;
                            }
                            else
                                sum += j;
                        }
                    }
                    if (sum == i)
                        resultList.Add(i);
                }
                return resultList.ToArray();
            }
        }
      

  5.   


    现在好了,刚才我加了Console.ReadLine()..
      

  6.   


    那人可真有意思,我是来CSDN和你们学习来了,他可倒好,我不仅默默的伸出了中指
      

  7.   


    import java.util.ArrayList;
    import java.util.List;public class Test { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    List<Integer> answer = new ArrayList<Integer>(); for (int max = 10000; max > 1; max--) {
    int temp[] = new int[max];
    int index = 0;
    int result = 0;
    for (int i = 1; i < max; i++) {
    int c = max % i;
    if (c == 0) {
    temp[index] = i;
    index++;
    // System.out.println(i);
    } }
    for (int i = 0; i < temp.length; i++) {
    result = result + temp[i];
    }
    if (result == max) {
    answer.add(max);
    }
    // System.out.println("---------------------------------");
    } for (int i = 0; i < answer.size(); i++) {
    int num = answer.get(i);
    System.out.println(num);
    }
    }}
      

  8.   


    第二步循环(for (j = 1; j <= i / 2; j++))的时候,可以只需要判断到 j <= sqrt(i),
    相应的改为:
    for (j = 1; j <= sqrt(i); j++)
    {
        if (i % j == 0)
        sum = sum + j + (i/j);
    }
    这样效率能高些
      

  9.   

    上面写的还有些问题,当 j=1 时,不用去多加(i/j)
    可以做一个判断,
    或者,初始时 sum = 1 然后写成 for (j = 2; j <= sqrt(i); j++)后面不变。
      

  10.   

    一个公式 (2^n - 1) * 2^k  要变成完美数,首先 (2^n - 1) 必须为素数。