如何用C#编写一个程序求水仙花数?

供稿:hz-xin.com     日期:2025-01-14
C#编程水仙花数

闲来无事做了个。可以查找任意位数的水仙花数。

虽然使用了缓存存储自然数的幂,但运算到7位以上依旧非常慢。
public static int[] 整数转数组(int i) { string s = i.ToString(); var re = new int[s.Length]; for (int k = 0; k > 结果 = new SortedList>(); //遍历开始位数 ~ 结束位数 for (int n = n1; n (); 结果.Add(n, 列表); Console.WriteLine(n + "位数:"); //创建n位数幂的缓存1 ~ 9数字的n次方整数 int[] nx = new int[10]; for (int k = 0; k <= 9; k++) { nx[k] = (int)Math.Pow(k, n); } //遍历100 ~ 999,更多位数类推 int start = (int)Math.Pow(10, n - 1); // 百位数开始值 100 for (int i = start; i < start * 10; i++) { //分解i为数组 var arr = 整数转数组(i); //求各位数的幂的和 int sum = 0; for (int j = 0; j < arr.Length; j++) { sum += nx[arr[j]]; } //判断 if (sum == i) { 列表.Add(i); Console.WriteLine(i); } } } Console.WriteLine("{0} ~ {1} 位数的水仙花数查找完毕。", n1, n2); Console.ReadKey(); }如满意,请采纳,谢谢。

我是做C#的
第一种方法:using System;class ShuiXianHua { static void Main() { for(int i=1;i<10;i++) for(int j=0;j<10;j++) for(int k=0;k<10;k++) if(i*100+j*10+k==Math.Pow(i,3)+Math.Pow(j,3)+Math.Pow(k,3)) Console.Write("{0,5}",i*100+j*10+k); Console.WriteLine(); } }第二种方法:using System;class ShuiXianHua { static void Main() { int i,j,k; for(int num = 100;num<1000;num++) { i = num/100; //百位数字 j = num%100/10; //十位数字 k = num%10; //个位数字 if(i*i*i+j*j*j+k*k*k == num) Console.Write("{0,5}",num); } Console.WriteLine(); } }第三种方法:using System;class ShuiXianHua { public bool IsShuiXianHua(int num) //定义一个函数判断一个数是否为水仙花数 { bool mark = false; int i,j,k; i = num/100; //百位数字 j = num%100/10; //十位数字 k = num%10; //个位数字 if(i*i*i+j*j*j+k*k*k == num) mark = true; else mark = false; return mark; } } class Test { static void Main() { ShuiXianHua sxh = new ShuiXianHua(); for(int n = 100;n < 1000; n++) { if(sxh.IsShuiXianHua(n)) Console.Write("{0,5}",n); } Console.WriteLine(); } }第四种方法:using System;class ShuiXianHua { static void Main() { int i,j,k; Console.WriteLine("水仙花数有:"); for(int n=100;n<1000;n++) { i = n/100; //获得百位上的数字 j = (n -i*100)/10; //获得十位上的数字 k = n - i*100 - j*10; //获得个位上的数字 if(Math.Pow(i,3)+Math.Pow(j,3)+Math.Pow(k,3)==n) Console.Write("{0,5}",n); } Console.WriteLine(); } }第五种方法:using System;class ShuiXianHua { static void Main() { string s; int i,j,k; Console.WriteLine("水仙花数有:"); for(int n=100;n<1000;n++) { s = n.ToString(); //将数字n转化为字符串 i = s[0] - '0'; //获得百位上的数字 j = s[1] - '0'; //获得十位上的数字 k = s[2] - '0'; //获得个位上的数字 if(i*i*i + j*j*j + k*k*k == n) Console.Write("{0,5}",n); } Console.WriteLine(); } }

C#,使用.Net6编写:

//水仙花数的搜索范围var index = 100; //因为水仙花数要求三位及以上,所以从100开始var end = 10000;
//循环主体 如上则范围为 [1,10000] 内寻找for (; index <= end; index++) {
//通过 log10 可以取得该数字的位数长度    int dg = (int)Math.Log10(index) +1; //将 log10 的位数向下取整保留进制数量的整数(+1是因为后续包含个位数)    //将每一位转换成数字(不使用 string 中 char 转 int,纯数字转换)    var sum = 0; //分位累加器    var digits = new int[dg]; //创建一个用于单独储存每一位的    for(int i = dg; i > 0; i--)
{
var x = index - sum; //用于舍去高位,见 P1        int dplace = (int)Math.Pow(10, i-1); //当前位数的值,如 1,10,100,1000...        var p = x / dplace; //当前位的值        sum += dplace * p; //将前边已经取得的位计入累加用于在后续舍去(P1)        digits[dg - i] = p; //将位数加在累加器上    }
//判断该数字是否符合条件    var nn = 0;
foreach(var d in digits)
{
nn += (int)Math.Pow(d, dg); //所有位 的位数幂 求和    }
if(nn == index) //当所有位的位数幂的和等于这个数本身时返回结果    {
Console.WriteLine($"{index} 是水仙花数");
}
}



LZ你好~
首先你要理解啥是水仙花数:

水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。(例如:1^3 + 5^3 + 3^3 = 153)

以上来自百度百科。

按照楼主的程序,有3层循环,姑且叫做a循环,b循环,c循环。
我们先从循环上下界和条件来看:
楼主用a循环代表个位数,用b循环代表10位数,c循环代表百位数,对嘛?假设是这种情况,让我们先不看代码。
事实上a循环是最外面的循环,c循环是最里面的循环,而计数按照逻辑应该是 111,112,113这样增长的,所以逻辑上应该反过来,a代表百位数,b代表10位数,c代表个位数。(其实您的方式也可以遍历所有您想遍历的数,只不过从逻辑上变成111,211,311...911,121,221...这样了,但是不觉得很不舒服嘛~)
然后我们来分析代码,结构很明白了:
a循环,百位数
{
b循环,十位数
{
c循环,个位数
{
验证

}

}

}

然后我们来确定验证:
一个水仙花数n,假设是1000以内的3位数,写作abc也就是 n = a*100 + b*10 + c = a^3 + b^3 + c^3,这不就是验证条件嘛?所以条件就是a*100 + b*10 + c = a*a*a + b*b*b + c*c*c;

然后来看循环上下界,百位数可以从1-9,十位数可以从0-9,个位可以从0-9,这时候程序就完成了啦。

楼主在确定上下界的时候犯了错哦,十位数不可以当做10到99,你要单纯的将她看成数字,因为十位数只可能出现0-9,这10种情况,而不会出现11,23,56这样的情况吧?

所以关键的循环体应该是:

for(a=1;a<=9;a++)
{
for(b=0;b<=9;b++)
{
for(c=0;c<=9;c++)
{
if(a*100 + b*10 + c == a*a*a + b*b*b + c*c*c)
{
printf("%d,%d,%d\n",a,b,c);

}

}

}

}

我把大括号全带上了,请养成良好的编程习惯哦~
当然你也可以把最后验证部分(if部分)替换成三元表达式,使用某一些编译器效率会提高一点:

for(a=1;a<=9;a++)
for(b=0;b<=9;b++)
for(c=0;c<=9;c++)
a*100 + b*10 + c == a*a*a + b*b*b + c*c*c ? printf("%d,%d,%d\n",a,b,c):; // 注意有个':'

输出所有的“水仙花数”用c语言程序怎么做?水仙花数例;153=1^3+5^...
, n);} } return 0;} ```第一个程序使用三层嵌套循环来找到所有的水仙花数,它检查所有可能的百位、十位和个位数字的组合。第二个程序则更为高效,它首先将数字分解为百位、十位和个位,然后计算每个位上的数字的立方和,最后比较这个和与原始数字是否相等。如果相等,那么这个数字就是水仙花数。

水仙花数用C语言怎么表示?
为了在C语言中表示水仙花数,你可以编写一个程序,该程序会遍历所有的三位数,并检查每个数的每一位数字的立方和是否等于该数本身。以下是一个简单的C语言程序,它实现了这一逻辑:```c include int main() { int num, hun, ten, one;printf("水仙花数有:\\n");for (num = 100; num < ...

“水仙花数”C语言程序
以下是一个C语言程序,旨在找出满足"水仙花数"条件的数,即每个数位上的数字的立方和等于其本身的数。```c include int main() { printf("输出水仙花数:\\n");for (int i = 100; i < 1000; i++) { int num_0 = i % 10;int num_1 = (i \/ 10) % 10;int num_2 = (i \/ ...

用C语言求出100到1000之间的水仙花数?
digit = i - h * 100 - t * 10; \/\/ digit为个位上的数 if (i == h * h * h + t * t * t + digit * digit * digit) { printf("%d\\n", i);} } return 0;} ```水仙花数,又称阿姆斯特朗数,是指一个n位数,它的每个位上的数字的n次幂之和等于它本身。在100到10...

如何利用C\/C++语言编程打印出所有的“水仙花数”?
要利用C\/C++语言编程打印出所有的“水仙花数”,首先需要理解“水仙花数”的定义:它是指一个三位数,其各位数字的立方和等于该数本身。例如,153是一个“水仙花数”,因为153等于1的三次方加上5的三次方加上3的三次方。1. 程序分析:为了找到所有的“水仙花数”,我们可以使用for循环来遍历100到999...

用C#语言里的循环语句计算《输出100以内的水仙花数,输出所有3位水仙花...
新建一个C#的控制台应用程序,工程名为 test,写代码: using System;using System.Collections.Generic;using System.Text;namespace test { class Program { static void Main(string[] args){ int ge, shi, bai;Console.WriteLine("所有水仙花数是:");for (int i = 100; i <= 999; i++)...

c语言中,如何输出所有的水仙花数
2. 编写判断水仙花数的函数:这个函数需要提取输入数值的个位、十位和百位数字,计算它们的立方和,并与原数值比较以确定是否为水仙花数。3. 遍历所有三位数:从100到999,对每个数使用判断函数,如果它是一个水仙花数,则输出它。下面是实现上述步骤的代码示例:```c include \/\/ 判断一个数是否为...

c语言编程题打印出所有的“水仙花数”所谓“水仙花数”是指一个三位数...
1. 题目理解:题目要求寻找所有的三位数,这些数的每个位上的数字的立方和等于该数本身。例如,153是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153。2. 程序设计:我们需要一个循环来遍历100到999之间的所有三位数。对于每个数,我们需要计算其各位上的数字的立方和,并检查这个和是否等于原数。3....

有C#编写查找10000内的水仙花数。
0; int baiyushu = 0; bai = i \/ 100; baiyushu = i % 100; shi = baiyushu \/ 10; ge = baiyushu % 10; if (i == bai * bai * bai + shi * shi * shi + ge * ge * ge) { Response.Write("水仙花数:" + i + ""); } } ...

程序设计题找出所有的“水仙花数”,所谓“水仙花数”是指一个三位数...
水仙花数是指一个三位数,它的每个位上的数字的立方和等于它本身。例如:153 是一个水仙花数,因为 1^3 + 5^3 + 3^3 = 153。下面是一个简单的C语言程序,用来找出所有的水仙花数:```c include int main() { int a, b, c, i;for(i = 100; i <= 999; i++) { a = i \/ ...