`
universsky
  • 浏览: 99486 次
文章分类
社区版块
存档分类
最新评论

求解所有的水仙花数(回归数)----大数字[40]位数量级别的运算算法

 
阅读更多
 
#include <stdlib.h>
#include <stdio.h>
#include <sys/time.h>
 
#define base  100000000
#define ds 5
 
int powD[10][ds];
int sum[ds];
int num[10];
int N;
struct timeval start, end;
 
void init(void)
{
  int i, j, k;
 
  for (i = 0; i <= 9; i ++)
    for (j = 0; j < ds; j ++)
      powD[i][j] = 0;
 
  for (i = 0; i <= 9; i ++)
    num[i] = 0;
 
  for (i = 1; i <= 9; i ++)
    powD[i][0] = i;
}
 
void nextPower(void)
{
   int i, j, t;
   for (i = 2; i <= 9; i ++)
   {
       t = 0;
       for (j = 0; j < ds; j ++)
       {
           t = powD[i][j] * i + t;
           if (t >= base)
           {
               powD[i][j] = t % base;
               t /= base;
           }
           else
           {
               powD[i][j] = t;
               t = 0;
           }
       }
   }
}
 
int circle(int n, int b)
{
  int i, j, k;
  double tm;
 
  if (n == 0)
  {
    if (sort())
    {
      k = ds - 1;
      while ((sum[k] == 0) && (k >= 0))
        k --;
      gettimeofday(&end, NULL);
      tm = (end.tv_sec - start.tv_sec) * 1000000.0 + (end.tv_usec - start.tv_usec);
      tm /= 1000000.0;
      printf("%4.4f  ", tm);
      printf("%2d: ", N);
      printf("%d", sum[k]);
      if (k > 0)
        for (i = k - 1; i >= 0; i --)
          printf("%08d", sum[i]);
      printf("\n");
    }
  }
  else
     for (i = 0; i <= b; i ++)
     {
       num[i] ++;
           circle(n-1, i);
       num[i] --;
     }
}
 
 
int sort(void)
{
  int i, j, t;
  int temp[ds], d[10];
 
  for (i = 0; i < ds; i ++)
    temp[i] = sum[i] = 0;
 
  for (i = 0; i <= 9; i ++)
    d[i] = 0;
 
  for (i = 1; i <= 9; i ++)
    if (num[i])
    {
      t = 0;
      for (j = 0; j < ds; j ++)
      {
        t = powD[i][j] * num[i] + t;
        if (t >= base)
        {
            temp[j] = t % base;
            t /= base;
        }
        else
        {
            temp[j] = t;
            t = 0;
        }
      }
 
      t = 0;
      for (j = 0; j < ds; j++)
      {
        t = temp[j] + sum[j] + t;
        if (t >= base)
        {
            sum[j] = t - 100000000;
            t = 1;
        }
        else
        {
            sum[j] = t;
            t = 0;
        }
      }
    }
 
    for (i = ds - 1; i >= 0; i --)
    {
        t = sum[i];
        if (t > 0)
          while (t > 0)
          {
              d[t % 10] ++;
              t /= 10;
          }
    }
 
    for (i = 1; i <= 9; i ++)
      if (num[i] != d[i])  return 0;
    return 1;
}
 
int main(void)
{
  int i, j;
 
  gettimeofday(&start, NULL);
  init();
  nextPower(); //是平方
  for (i = 2; i <= 40; i ++)
  {
    N = i;
    printf("Search %d...\n", i);
    circle(N, 9);
    nextPower();
  }
  return 0;
}


分享到:
评论

相关推荐

    编程求解水仙花数(Matlab)

    在编程领域,水仙花数是一种特殊的三位数(在本问题中扩展到了任意位数),其定义是:一个 n 位数,如果它的每一位数字的 n 次幂之和等于该数本身,那么这个数就是水仙花数。例如,153 是一个三位水仙花数,因为 1^3...

    21位水仙花数JAVA代码

    对于21位的水仙花数而言,它需要满足以下条件:所有位上的数字的21次幂之和等于该数本身。这类数非常罕见,由于其位数较多,因此计算上存在一定的挑战性。 ### 二、21位水仙花数的求解方法 #### 1. 基本思路 由于...

    4.4日作业第三章_水仙花数_

    在编程求解水仙花数时,效率是一个重要的考虑因素。可以采用优化策略,比如使用位操作减少计算次数,或者利用已知的水仙花数范围进行优化。此外,为了提高代码的可读性和可维护性,良好的编程实践如注释、变量命名...

    求出水仙花数V10

    在编程领域,求解水仙花数是一项基础的算法练习,它可以帮助初学者理解数字处理和循环结构的运用。 首先,我们需要了解水仙花数的数学定义。一个三位数n(100≤n≤999)是水仙花数,当且仅当: n = (n/100)^3 + (n...

    java水仙花数实验报告.docx

    求解水仙花数的问题提供了一个良好的平台,用于实践和巩固 Java 编程的基本技巧,如控制流程(for 循环)、字符串处理(获取数字的位数)、数学运算(幂次运算)以及条件判断(if 语句)。此外,它还展示了如何将...

    root-music2.rar_ROOT_root-music_水仙花数MATLAB

    MATLAB提供了多种循环结构,包括for循环和while循环,它们可以让我们遍历0到n之间的所有数字,寻找符合条件的水仙花数。在编写循环时,我们需要注意循环变量的初始化、条件判断以及迭代更新,这些是循环结构的基本...

    C语言:用程序求水仙花数

    总的来说,编写求解水仙花数的C语言程序不仅可以锻炼基本的编程技能,还能帮助理解数值运算、条件判断和循环结构在实际问题中的应用。通过这样的练习,开发者可以逐步提升自己的编程思维和问题解决能力。

    C语言求“水仙花”数(详细)

    在C语言中,求解水仙花数是一个基础的算法练习,涉及到整数的位操作、循环控制和条件判断。下面我们将详细探讨如何用C语言来实现这个功能。 首先,我们需要理解C语言的基础语法。C语言是一种静态类型、编译型的通用...

    cpp代码-求水仙花数

    在C++中,求解水仙花数通常会用到一个循环来遍历100到999之间的所有三位数,然后对每个数字进行位操作以获取其各位数字,并计算它们的立方和。以下是一个可能的实现: ```cpp #include bool isNarcissistic(int ...

    C语言算法合集含最大公约数、最小公倍数、猴子吃桃子、百钱百鸡问题、渔夫打鱼问题、二分查找法、分块查找法、求水仙花数、统计单词个数

    7. **水仙花数**:水仙花数是指一个三位数,其各位数字立方和等于该数本身。例如153(1^3 + 5^3 + 3^3 = 153)。编写程序判断一个数是否为水仙花数,可以锻炼对位运算的理解和应用。 8. **统计单词个数**:在文本...

    Java 算法+例题 很多金典例题,包括兔子算法 = =

    【Java算法+例题】中的知识点主要涵盖了三个经典的算法问题,分别是兔子繁殖问题(斐波那契数列)、素数判断以及水仙花数的计算。以下是对这些知识点的详细说明: 1. **兔子繁殖问题**(斐波那契数列) - **题目...

    java算法练习题 大家下载看看啦

    - **描述**:水仙花数是指一个三位数,它的每个位上的数字的立方和等于它本身。 - **实现思路**: - 使用`for`循环遍历100到999之间的所有数字。 - 对于每一个数字,分别提取出百位、十位和个位上的数字。 - 计算...

    shuixianhua.zip_shuixianhua

    在描述中提到的"计算水仙花数(x^3+y^3+z^3=x+y+z)",虽然公式略有不同,但可以推测这可能是因为输入的描述有误,实际意图应该是求解满足三位数的各位数字立方和等于该数的三位数。正确的水仙花数计算不涉及变量x、y...

    JAVA经典算法40题.doc

    水仙花数是另一个有趣的数学概念,它指的是一个三位数,其各位数字的立方和等于该数本身。例如153就是一个水仙花数(1^3 + 5^3 + 3^3 = 153)。文档中的程序3通过`math`类中的`shuixianhua`方法来判断一个数是否为...

    C/C++常用算法手册.秦姣华(有详细书签).rar

    9.4.2 计算水仙花数算法 281 9.5 自守数 283 9.5.1 自守数概述 283 9.5.2 计算自守数算法 284 9.6 最大公约数 287 9.6.1 计算最大公约数算法——搌转相除法 287 9.6.2 计算最大公约数算法一一Stein算法 288 ...

    Java经典问题算法大全

    水仙花数是指一个三位数,其各位数字立方和等于该数本身。例如,153就是一个水仙花数,因为153 = 1^3 + 5^3 + 3^3。程序3的目标是打印出所有三位的水仙花数。 解决这个问题的关键在于如何将一个三位数分解成个位、...

    c算法经典例题

    #### 知识点十三:打印“水仙花数” - **核心概念**:数字运算与判断。 - **实现思路**:遍历100到999之间的所有数字,检查每个数的各位数字立方和是否等于原数本身。 #### 知识点十四:正整数分解质因数 - **核心...

    JAVA练习题(50题)

    - “水仙花数”定义:一个三位数,其各位数字立方和等于该数本身。 - 数字分解与重组。 - 条件判断语句。 - **实现思路**:遍历100至999之间的所有数字,并检查每个数是否满足“水仙花数”的定义。 #### 练习题4...

    经典的100个c算法

    代码示例通过遍历100至999之间的所有数字,并计算每位数字的立方和来检查哪些数是水仙花数,最终打印出所有的水仙花数。 ### 4. 因数分解 因数分解是将一个正整数表示为其质因数乘积的过程。在C语言中,可以使用...

    C++经典问题算法分析[整理].pdf

    水仙花数是指一个三位数,其各位数字的立方和等于该数本身。通过分别提取三位数的百位、十位和个位,计算它们的立方和,判断是否等于原始数字。提取位数时,可以通过整除和取余操作实现。 这些经典问题展示了C++在...

Global site tag (gtag.js) - Google Analytics