当前位置:编程学习 > C#/ASP.NET >>

一道有意思的大学C#题目

各位大侠们 :
题目:如果一个数的因子之和为它本身,则称为这个数为完数,自定义一个类,编写一个方法,实现输出1-100之间的所有完数。
用 C#怎么写啊 求教了啊  --------------------编程问答-------------------- 怎么什么都是和大学有关呢。。 --------------------编程问答-------------------- 拆分因子,相加因子,判断是否和原数相等,循环以上
话说。。。忘了因子是什么 --------------------编程问答-------------------- 边找因子边相加
从1到 根号2 这个数找,是因子就相加




从中也可能还有什么优化条件 --------------------编程问答-------------------- 打个比方 就说6吧 6的因子就是 1 2 3 而 6因为是它本身所以不是他的因子 得到 1+2+3=6 所以他是个完数

再如 12 因子是1 2 3 4 6 的 1+2+3+4+6=16。。。。。不等于12 所以12非完数。 --------------------编程问答-------------------- 简单点说就是小于一百的任意组合之间任意组合,他们的乘积 与 他们的和 相等就是完数了? --------------------编程问答--------------------
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections;
using System.IO;
using System.Xml;

namespace CSharpTest
{
    class perfectnumber
    {
        public static void count(int bigger)
        {
            for (int i = 1; i <= bigger; i++)
            {
                int num = 0;
                for (int j = 1; j <= i/2; j++)
                {
                    if (i % j == 0)
                    {
                        num += j;
                       // Console.WriteLine("{0} {1}", i, j);
                    }
                }
                if (i == num) Console.WriteLine(i);
            }
        }
    }
    class B
    {
        static void Main(string[] args)
        {
            perfectnumber.count(100);
        }

       
    }
}
--------------------编程问答--------------------
引用 4 楼 a645289309 的回复:
打个比方 就说6吧 6的因子就是 1 2 3 而 6因为是它本身所以不是他的因子 得到 1+2+3=6 所以他是个完数

 再如 12 因子是1 2 3 4 6 的 1+2+3+4+6=16。。。。。不等于12 所以12非完数。


看6楼代码 --------------------编程问答-------------------- LZ是C#语法不会还是算法不会呀~~~高中的时候就做这种题目了呢~~~ --------------------编程问答--------------------
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections;
using System.IO;
using System.Xml;

namespace CSharpTest
{
    class perfectnumber
    {
        public static void count(int bigger)
        {
            for (int i = 0; i <= bigger; i++)
            {
                int num = 0;
                for (int j = 1; j <= i/2+1; j++)
                {
                    if (i % j == 0)
                    {
                        num += j;
                      //  Console.WriteLine("{0} {1}", i, j);
                    }
                }
                if (i == num) Console.WriteLine(i);
            }
        }
    }
    class B
    {
        static void Main(string[] args)
        {
            perfectnumber.count(100);
        }

       
    }
}

1也应该算吧 --------------------编程问答-------------------- 1既不是质数,也不是和数 --------------------编程问答-------------------- 不懂因子的路过。。
UP --------------------编程问答--------------------
引用 9 楼 lcl_data 的回复:
C# codeusing System;using System.Collections.Generic;using System.Text;using System.Text.RegularExpressions;using System.Collections;using System.IO;using System.Xml;namespace CSharpTest
{class perfectnumber
    {publicstaticvoid count(int bigger)
        {for (int i=1; i<= bigger; i++)
            {int num=0;for (int j=1; j<= i/2; j++)
                {if (i% j==0)
                    {
                        num+= j;//  Console.WriteLine("{0} {1}", i, j);                    }
                }if (i== num||i==1) Console.WriteLine(i);
            }
        }
    }class B
    {staticvoid Main(string[] args)
        {
            perfectnumber.count(100);
        }

       
    }
}
应该这样算吧
--------------------编程问答-------------------- 呵呵 我们刚开始学习C#语言 所以一些简单的东西我都不是很会 大家别笑啊 还有 特别谢谢6楼 写的 代码 再次谢谢大家乐 --------------------编程问答-------------------- if(i==num||i==1)Console.writeLine(i);
应该是这样的吧
--------------------编程问答-------------------- 谢谢大家的 帮助啊 我们刚开的这门课  我也非常感兴趣 希望能和大家一起进步学习啊 特别感谢六楼的 代码 些的很正确 再次谢谢啦 --------------------编程问答-------------------- 我写了一个笨拙的方法

        public static void count(int bigger)
        {
            for (int i = 1; i <= bigger; i++)
            {
                int sum = 0;
                for (int j = 1; j <= i; j++)
                {
                    for (int n = j; n <= i; n++)
                    {
                        if (i == j * n)
                        {
                            sum += j + n;

                        }
                    }
                }
                if (sum - i == i)
                {
                    Console.WriteLine(i.ToString());
                }

            }
        }
--------------------编程问答--------------------
引用 16 楼 jiangshun 的回复:
我写了一个笨拙的方法

C# codepublicstaticvoid count(int bigger)
        {for (int i=1; i<= bigger; i++)
            {int sum=0;for (int j=1; j<= i; j++)
                {for (int n= j; n<= i; n++)
                    {if (i== j* n)
                        {
                            sum+= j+ n;

                        }
                    }
                }if (sum- i== i)
                {
                    Console.WriteLine(i.ToString());
                }

            }
        }
推荐 --------------------编程问答--------------------
引用 13 楼 a645289309 的回复:
呵呵 我们刚开始学习C#语言 所以一些简单的东西我都不是很会 大家别笑啊 还有 特别谢谢6楼 写的 代码 再次谢谢大家乐


写的很正确也不结贴? --------------------编程问答-------------------- 大学作业啊??~~~这个~回忆中 --------------------编程问答-------------------- 作业或实验题目还是自己做啊! --------------------编程问答-------------------- 都上大学了,原理都说了,还要找人实现代码啊~~~~~


多学习哦 --------------------编程问答-------------------- 我也来一段,假如因子的算法是没错的,那这个就是没错的了

        private bool FindOut(int Input)
        {
            int iTemp = 1;
            for (int i = 2; i <= Input / 2; i++)
            {
                if (Input % i == 0)
                {
                    iTemp = iTemp + i;
                }
            }
            if (iTemp == Input)
            {
                return true;
            }
            return false;
        }

        private void TestFind()
        {
            List<int> ilist = new List<int>();
            int iText = 100;
            for (int i = 1; i <= iText; i++)
            {
                if (FindOut(i))
                {
                    ilist.Add(i);
                }
            }
            //FindOut(6);
        }
--------------------编程问答--------------------
引用 6 楼 lcl_data 的回复:
C# codeusing System;using System.Collections.Generic;using System.Text;using System.Text.RegularExpressions;using System.Collections;using System.IO;using System.Xml;namespace CSharpTest
{class perfec?-


 结贴啊 --------------------编程问答-------------------- 不知道有没有丢解

using System;

namespace CSharpTest
{
    class Program
    {
        static void Main(string[] args)
        {
            for (ulong i = 2; i < Int32.MaxValue; i <<= 1)
            {
                if (IsPer(i * 2 - 1))
                    Console.WriteLine(i * (i * 2 - 1));
            }

            Console.ReadKey();
        }

        static bool IsPer(ulong num)
        {
            for (ulong i = 2; i < Math.Sqrt(num); i++)
            {
                if (num % i == 0)
                    return false;
            }

            return true;
        }
    }
}
--------------------编程问答-------------------- 6
28
496
8128
33550336
8589869056
137438691328
2305843008139952128
2658455991569831744654692615953842176
191561942608236107294793378084303638130997321548169216 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 25 楼 litaoye 的回复:
6
28
496
8128
33550336
8589869056
137438691328
2305843008139952128
2658455991569831744654692615953842176
191561942608236107294793378084303638130997321548169216


这个牛! --------------------编程问答--------------------
引用 1 楼 bbb332 的回复:
怎么什么都是和大学有关呢。。
--------------------编程问答-------------------- 没看下都忘记什么是因子了 - -! --------------------编程问答-------------------- 题目有问题啊,LZ

一个数N的因子就是它的因数,最起码包括1和N,而1+N>N,所以不会出现楼主所说的“完数” --------------------编程问答-------------------- 大学代码又不管效率的 多重循环呗 --------------------编程问答-------------------- 题目应该为
如果一个数的所有真因子(除了本身的因子)之和为它本身,则称为这个数为完全数,如6=1+2+3 --------------------编程问答-------------------- 求一个数N的真因数,可循环from 1 to N的平方根(当然可放宽至N/2),每求出一个就累加一下,看最后的和是否等于N --------------------编程问答-------------------- 大学 --------------------编程问答-------------------- up`````````````````````````` --------------------编程问答--------------------
引用 24 楼 litaoye 的回复:
不知道有没有丢解

using System;

namespace CSharpTest
{
    class Program
    {
        static void Main(string[] args)
        {
            for (ulong i = 2; i < Int32.MaxValue; i < <= 1)
            {
                if (IsPer(i * 2 - 1))
                    Console.WriteLine(i * (i * 2 - 1));
            }

            Console.ReadKey();
        }

        static bool IsPer(ulong num)
        {
            for (ulong i = 2; i < Math.Sqrt(num); i++)
            {
                if (num % i == 0)
                    return false;
            }

            return true;
        }
    }
}



可不可以解释一下
Console.WriteLine(i * (i * 2 - 1));
--------------------编程问答-------------------- 我是来学习的。。。。。
有几个写了非常不错 --------------------编程问答-------------------- 如果2^n - 1是质数,那么(2^(n-1))*(2^n - 1)是一个完数。可以通过分解因式来证明。
所有的偶数完数应该都可以写为(2^(n-1))*(2^n - 1)的形式(奇数完数的问题,印象中好像没有定理或证明)。
因此问题转化为求2^n - 1是素数的n(我用的方法只能求int64的解,可以用其他素数判断来求更大的解),
这样的n肯定是素数,并有现成的方案,这样的n被称为梅森素数,前34个梅森素数列表如下

2, 3, 5, 7, 13, 17, 19, 31, 61, 89, 107, 127, 521, 607, 1279, 2203, 2281, 3217, 4253, 4423, 9689, 9941, 11213, 19937, 21701, 23209, 44497, 86243, 110503, 132049, 216091, 756839, 859433, 1257787, 1398269, 2976221, 3021377, 6972593, 13466917

用梅森素数可以构造出更多的完数,构造二进制的解不难,转化为10进制可就复杂了。

引用 36 楼 lavilycn 的回复:
 可不可以解释一下
 Console.WriteLine(i * (i * 2 - 1));
--------------------编程问答-------------------- 不就是算法么…………
--------------------编程问答-------------------- 刚入门学习一下.... --------------------编程问答-------------------- 因子应该不包括1吧,否则6=1*1*1*1*2*3, 1+1+1+1+2+3 != 6 --------------------编程问答-------------------- 小样,让人帮你做作业来的吧? --------------------编程问答-------------------- 24楼的算法等于说如果有一个整数i,若2i-1是质数,则i*(2i-1)是完数。不知道这个是什么定理啊 --------------------编程问答-------------------- 循环遍历 求和 判断 --------------------编程问答-------------------- 大学数学老师死的早 哎 --------------------编程问答-------------------- 有几个写的都不错,原理都懂了,实现应该没什么问题吧 --------------------编程问答-------------------- 小学信息奥赛题。。。 --------------------编程问答-------------------- 结贴率 0
作业不自己做,这个都不会的话,说明完全不懂循环是怎么回事,别说c#了
换别的什么语言也不行 --------------------编程问答--------------------
引用 38 楼 litaoye 的回复:
如果2^n - 1是质数,那么(2^(n-1))*(2^n - 1)是一个完数。可以通过分解因式来证明。
所有的偶数完数应该都可以写为(2^(n-1))*(2^n - 1)的形式(奇数完数的问题,印象中好像没有定理或证明)。
因此问题转化为求2^n - 1是素数的n(我用的方法只能求int64的解,可以用其他素数判断来求更大的解),
这样的n肯定是素数,并有现成的方案,这样的n被称为梅森素数,前34个梅森素数列表如下

2, 3, 5, 7, 13, 17, 19, 31, 61, 89, 107, 127, 521, 607, 1279, 2203, 2281, 3217, 4253, 4423, 9689, 9941, 11213, 19937, 21701, 23209, 44497, 86243, 110503, 132049, 216091, 756839, 859433, 1257787, 1398269, 2976221, 3021377, 6972593, 13466917

用梅森素数可以构造出更多的完数,构造二进制的解不难,转化为10进制可就复杂了。

引用 36 楼 lavilycn 的回复:可不可以解释一下 Console.WriteLine(i * (i * 2 - 1));


学习了 看看 --------------------编程问答-------------------- 这里的强人高手真是多啊!向大家学习了
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,