21xrx.com
2024-12-22 19:42:24 Sunday
登录
文章检索 我的文章 写文章
C++求解水仙花数的方法和计数
2023-07-04 20:42:49 深夜i     --     --
C++ 水仙花数 方法 计数

水仙花数是指一个n位数各个数位的n次幂之和等于它本身的数,例如153是一个三位数的水仙花数,因为1^3 + 5^3 + 3^3 = 153。C++语言可以求解水仙花数,下面介绍两种方法。

方法一:暴力枚举法

这种方法比较简单,只需要用循环枚举三位数中的每个数,然后计算它的各个位上数字的n次幂之和,判断是否等于它本身即可。代码如下:


#include <iostream>

using namespace std;

int main()

{

  for(int i = 100; i <= 999; i++)

  {

    int a = i / 100; // 百位数

    int b = i / 10 % 10; // 十位数

    int c = i % 10; // 个位数

    if(i == a*a*a + b*b*b + c*c*c)

      cout << i << " ";

  }

  return 0;

}

方法二:数学方法

这种方法利用了数学的一些规律,可以提高计算效率。首先我们可以计算出n位数的最大值:当n为3时最大值为999。接下来我们可以根据水仙花数的定义,先计算出每一位数字的n次幂并累加,然后再判断结果是否等于当前的数。代码如下:


#include <iostream>

using namespace std;

int main()

{

  int n; // n位数

  cin >> n;

  int maxNum = n * pow(9, n); // 最大值

  for(int i = 1; i <= maxNum; i++)

  {

    int sum = 0;

    int num = i;

    while(num > 0)

    {

      int r = num % 10;

      sum += pow(r, n);

      num /= 10;

    }

    if(sum == i)

      cout << i << " ";

  }

  return 0;

}

计数水仙花数的方法

以上两种方法都可以求解水仙花数,但如果需要知道某个范围内的水仙花数的个数,则可以采用方法二,并且可以进一步优化计算效率。可以通过预处理每个数字各个位上的n次幂,然后将计算结果存储在数组中,这样每次判断一个数是否为水仙花数时只需要通过数组查找即可。代码如下:


#include <iostream>

using namespace std;

int main()

{

  int n; // n位数

  cin >> n;

  int maxNum = n * pow(9, n); // 最大值

  int powArray[10][n+1]; // 存储各个数字的n次幂

  for(int i = 0; i < 10; i++)

  {

    powArray[i][0] = 1;

    for(int j = 1; j <= n; j++)

      powArray[i][j] = powArray[i][j-1] * i;

  }

  int cnt = 0; // 计数器

  for(int i = 1; i <= maxNum; i++)

  {

    int sum = 0;

    int num = i;

    while(num > 0)

    {

      int r = num % 10;

      sum += powArray[r][n];

      num /= 10;

    }

    if(sum == i)

      cnt++;

  }

  cout << cnt;

  return 0;

}

通过以上方法可以求解水仙花数并计数,这对于一些需要验证水仙花数性质的科学研究和编程练习都具有一定的参考价值。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复