水仙数问题详解

今天段子里面的朋友问我关于水仙数问题。
发出来万一有新人正好需要呢?
code:C#
date:2017年1月1日19:11:04

  class Program
    {
        static void Main(string[] args)
        {
            #region 里面是验证水仙花的方法


           // //首先我们声明5个变量 用来存放 待验证的数字各位的值。
           // int i = 0;
           // int j = 0;
           // int k = 0;
           // int l = 0;
           // int m = 0;

           // //我们知道 371 这个数 百位为3,十位是7, 个位为1 。this's ok。
           // Console.WriteLine("请输入一个5位数字,验证是否为水仙花数字");
           // int s = Int32.Parse(Console.ReadLine());
           // //这里我们来获取一个数字,用来验证是否为水仙花数
           // /*---------------------------------华丽的分割线----------------------------*/
           // i = s / 10000;//看不懂? 就是把输入的s 小数点往左移动4位。
           // //比如23456,结果就是2.3456 。不过i是int类型。所以。。。。

           // //另外计算机里有个算法叫做取模。所以 我们来声明个变量先
           // int temp =0;
           // temp = s % 10000;//看不懂? 来看看结果吧
           //// Console.WriteLine("除法结果:"+i);//测试一下 看看是不是我们想要的结果。
           // //Console.WriteLine("取模结果:"+temp);//测试一下 看看是不是我们想要的结果。
           // /*---------------------------------华丽的分割线----------------------------*/
           // //结果上来看的话 好像很理想的样子, 我们拿到了第一位也就是万位的数字以及后面的4位。
           // //这个时候呢,我们是不是应该拿 后面这4位中的第一位,剩下3位呢?
           // //后面4位存在变量temp中的 SO
           // j = temp / 1000;//少了个0  看仔细哦,另外我用的temp 不是s。还有 用了变量j  不是i
           // temp = temp % 1000;//这里 我们继续用temp 保存后面3位的数字,直接覆盖,就不需要再申明变量了。
           // //不用测试了。结果很easy。接下来就是取 后3位中的第一位和后两位。

           // k = temp / 100;//又少了个0  。还有 用了变量k  不是j
           // temp = temp % 100;

           // //接下来就是剩下的两位中的第一位
           // l = temp / 10;//又少了个0  。还有 用了变量小写的L  不是k了
           // temp = temp % 10;//这个就是最后一位了。不用再取了。我们直接把temp 的值给m吧。
           // m = temp;//一开始怕你不理解,所以声明了temp。其实一直可以用m带头temp的。
           // //看下我们的结果对不对。
           ////  Console.WriteLine(" 第一位:" + i + " 第二位:" + j + " 第三位:" + k + " 第四位:" + l + " 最后一位:" + m);
           // /*---------------------------------华丽的分割线----------------------------*/
           // //是时候来验证一下了。

           // //  i * i * i    +  j * j * j   +   k * k * k   +   l * l * l   +   m * m * m
           // // 这样看头不会晕
           // if (s == i * i * i + j * j * j + k * k * k + l * l * l + m * m * m)
           // {
           //     Console.WriteLine("真尼玛走运。被你蒙对了这真是个水仙花数字:" + s);
           // }
           // else
           // {
           //     Console.WriteLine("滚犊子,你以为水仙花数字那么多");

           // }


            #endregion
           //我们知道 任何整数 最高位不能为0。这是常识。
            //我们先思考个问题。如何输出所有的两位数字。不允许下面情况
            //for(int i =10;i<100;i++)
            //{
            //    Console.WriteLine(i);
            //}
            //我们这样来试试
            //for (int i =1;i<10;i++) //最高位不能为0  ,我们1开始反正最大为9
            //{
            //    for (int j = 0; j < 10; j++)//第二位无所谓,反正就是0-9
            //    {
            //        Console.Write(i + "" + j + "  ");
            //    }
            //}
            //Console.ReadKey();
            /*---------------------------华丽的分割线----------------------------------*/

            //很好我们拿到了所有的2位数。那么问题来了。如何拿到所有的5位数呢?
            //原理一样。我们5个内嵌循环就好了.我在声明两个变量。等下用来保存结果。
            //五位运算太慢。3位来测试。 首先组合出所有的三位组合,其实就是刚刚的循环少了那么两个
            int tempS_1 = 0;
            int tempS_2 = 0;
            Console.WriteLine("水仙花数字有:");
            for (int i = 1; i < 10; i++) //最高位不能为0  ,我们1开始反正最大为9
            {
                for (int j = 0; j < 10; j++)//第二位无所谓,反正就是0-9
                {
                    for (int k = 0; k < 10; k++) //第三位无所谓,反正就是0-9
                    {
                        tempS_1 = i * 100 + j * 10 + k * 1 ;
                        //还记得我们最开始 是如何取水仙花数字的每一位吗?所以 你应该明白这个意思了。
                        tempS_2 = i * i * i + j * j * j + k * k * k ;
                        //还记得我们是如何验证数字是不是水仙花数字的吗? 所以,你应该懵逼了。
                        if (tempS_1 == tempS_2)
                        //其实很简单,首先这3个循环 会列举所有的3位数字组合。
                        //tempS_1是水仙花数字的算法,tempS_2 是验证验证水仙花数字是否成立,
                        //当tempS_1==tempS_2的时候呢,也就是这个数字正好满足两种算法,也就是一个水仙花数字。
                        {
                            Console.WriteLine(tempS_1 + " ");
                        }
                    }

                }
                Console.ReadKey();
            }

        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值