今天段子里面的朋友问我关于水仙数问题。
发出来万一有新人正好需要呢?
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();
}
}
}