• 产生大于N的Smith数


    实验三  Smith

    实验目的:

    通过本次实验,掌握穷举算法的基本思想。

    实验环境:

    硬件:PC机

    软件:windows操作系统,C语言

    实验内容:

    若一个合数的质因数分解式逐位相加之和等于其本身逐位相加之和,则称这个数为Smith数。给定一个正整数N,求大于N的最小Smith数。

    实验学时:2

    实验过程:

    1.算法设计

    设计一个寻找大于N的最小史密斯数,首先这个史密斯数必须大于N,不能为素数。

    构造一个int isPrime(int x)函数,来判断这个数是不是素数。

    构造一个int everySum(int x)函数,来计算这个数每个位相加的和。

    构造一个int isSmith(int n)函数,调用上面两个函数来判断是否符合史密斯数的条件来判断这个数是不是史密斯数。

    主函数调用isSmith(int n)函数得到函数值,并且规定输入‘0’的时候程序结束。

    2.程序清单

     1 #include <stdio.h>
     2 #include <math.h> 
     3 //判断是否为素数 
     4 int isPrime(int x) 
     5 {
     6     int i,num = 1;
     7     for(i = 2; i < x; i++) 
     8     {
     9         if( x % i == 0) 
    10         {
    11             num = -1;
    12             break;
    13         }
    14     }
    15     if(num == 1)
    16         return 1;
    17     else
    18         return 0;
    19 }
    20 //计算每一位相加的和 
    21 int everySum(int x) 
    22 {
    23     int sum = 0;
    24     while(x > 0) {
    25         sum += x % 10;
    26         x /= 10;
    27     }
    28     return sum;
    29 }
    30 //判断是否为smith数 
    31 int isSmith(int n) 
    32 {
    33     int i,b = n;
    34     int num[1000],x = 0;
    35     int sum = 0;
    36     while( !isPrime(n)) 
    37     {
    38         for(i = 2; i < n; i++) 
    39         {
    40             if( isPrime(i) && n % i == 0)
    41             {
    42                 num[x] = i;
    43                 x++;
    44                 break;
    45             }
    46         }
    47         n /= i;
    48     }
    49     num[x] = n;
    50     for( i = 0; i <= x; i++) 
    51     {
    52         sum += everySum(num[i]);
    53     }
    54     if(sum == everySum(b))
    55         return 1;
    56     else
    57         return 0;
    58 }
    59 //主函数 
    60 int main()
    61 {
    62     int num;
    63     int flag = 0;
    64     while((scanf("%d",&num) != EOF) && (num != 0)) 
    65     /*
    66     EOF,为End Of File的缩写,通常在文本的最后存在此
    67     字符表示资料结束。在本句中表示若输入'0'表示字符结束。 
    68     */ 
    69     {
    70         flag = 0;
    71          for(int i = num + 1; ; i++) 
    72          {
    73              if( isSmith(i) ) 
    74              {
    75                 printf("%d
    ",i);
    76                 flag ++;
    77             }
    78             if(flag == 1)
    79             {
    80                 break;
    81             }
    82         }
    83     }
    84     return 0;
    85 }

    3.运行结果

     

    实验总结:

    通过这次实验,学会了怎样判断一个数是否为Smith数和它的判断条件,以及它的算法程序设计,用递归的方法写出了程序,以后要多利用递归算法,将大问题划分为小问题,优化程序设计。

  • 相关阅读:
    Ubuntu14.04安装ROS Indigo
    STM32F103移植uCOSIII始终卡在PendSV或Systick处解决办法
    STM32F103移植uCOSIII始终卡在PendSV或Systick处解决办法
    WIN7下PS/2等键盘失灵无法使用的解决办法--实测有效
    WIN7下PS/2等键盘失灵无法使用的解决办法--实测有效
    在altium designer9 等中使用protell99se的如0805,0603等PCB封装库
    在altium designer9 等中使用protell99se的如0805,0603等PCB封装库
    VB将输入文本框的数字分割并按十六进制发送
    Windows 10同步时间的方法
    maven安装cucumber的pom文件设置
  • 原文地址:https://www.cnblogs.com/ma1998/p/11639999.html
Copyright © 2020-2023  润新知