计算质数和回文数的小程序

Ruby 代码如下

 

   1:  def isZhishu?(num)
   2:      count = 2
   3:      while count < num do
   4:          return false if ( num % count ) == 0
   5:          count = count + 1
   6:      end
   7:   
   8:      return true
   9:  end
  10:   
  11:  def isHuiwen?(num)
  12:      s = num.to_s.reverse.to_i
  13:      return true if num == s
  14:   
  15:      return false
  16:  end
  17:   
  18:  count = 0
  19:  10000.times{ |i|
  20:      i = i + 1
  21:      if isZhishu?(i) && isHuiwen?(i) then
  22:          printf "%4d", i
  23:          print "\n"
  24:          count = count + 1
  25:      end
  26:  }
  27:  print "\n\nTotal:#{count}"

 

上面这个方法非常笨重,时间复杂度是 O(n^2),可以进行一些优化。根据 @sdpfoue 的建议,做了优化。

首先就是可以只对大于3的奇数进行检查,因为偶数肯定可以被2整除,所以不需要考虑。

另外循环相除的时候,可以只除以质数,这样也能够减少不少步骤。但是会增加空间的消耗,就是所谓的用空间换时间。

具体代码如下:

   1:  def isZhishu?(num, arrZhishu)
   2:      return true if num == 1 || num == 2
   3:      count = 2
   4:   
   5:      if( arrZhishu.empty? )then
   6:          #count = 2
   7:          while count < num do
   8:              return false if ( num % count ) == 0
   9:              if( count >= 11 ) then
  10:                  count = count + 2 # Only judge even numbers
  11:              else
  12:                  count = count + 1
  13:              end
  14:          end
  15:   
  16:          return true
  17:      else
  18:          arrZhishu.each{|value|
  19:              next if value == 1
  20:              return false if ( num % value ) == 0
  21:          }
  22:          return true
  23:      end
  24:  end
  25:   
  26:  def isHuiwen?(num)
  27:      s = num.to_s.reverse.to_i
  28:      return true if num == s
  29:   
  30:      return false
  31:  end
  32:   
  33:  count = 0
  34:  arrZhishu = Array.new
  35:  i = 0
  36:  while i < 10000000 do
  37:      if i >= 11 then
  38:          i = i + 2
  39:      else
  40:          i = i + 1
  41:      end
  42:   
  43:      if isZhishu?(i, arrZhishu) && isHuiwen?(i) then
  44:          arrZhishu.push(i)
  45:          #printf "%4d", i
  46:          #print "\n"
  47:          count = count + 1
  48:      end
  49:  end
  50:  print "\n\nTotal:#{count}"
时间: 2024-10-12 19:55:37

计算质数和回文数的小程序的相关文章

C语言判断回文数的小例子_C 语言

复制代码 代码如下: #include<stdio.h>#include<stdlib.h> int is_palindrome(char* para_str , int len); int main(int argc , char* argv[]){   int n = atol(argv[2]);     if (is_palindrome(argv[1],n))       printf("this string is palindrome !\n"); 

Python计算回文数的方法_python

本文实例讲述了Python计算回文数的方法.分享给大家供大家参考.具体如下: 这里检查数字是不是回文数,用196算法生成一个数字的回文数 num = 905; def is_Palindrome(num): """ 判断一个数字是不是回文数,这里有些取巧了 :param num: :return: """ """ :param num: :return: """ temp = "

C++回文数及素数问题计算方法_C 语言

本文实例讲述了C++回文数及素数问题计算方法.分享给大家供大家参考,具体如下: /* * 作 者: 刘同宾 * 完成日期:2012 年 11 月 16 日 * 版 本 号:v1.0 * * 输入描述: 编制一个返回值为bool型的函数isPrimer(),用于判断参数是否为素数,isPalindrome()用于判断参数是否是回文数,调用函数回答以下问题(可以分别编制几个程序完成,也可以在一个main()函数中完成,输出时,用明显的提示语,说明正在完成哪个任务.) (1)输出10000以内的所有素

C语言中判断一个数是否是回文数

注:回文数即数字顺着和反着是同一个数! 看了郝斌老师的C语言视频,虽然还只看了80多个,但是还是有一些体会,编程应该养成良好的编程风格,至少到现 在为止写的这些小程序都应该有下面这样一个过程: 1,流程:(知道程序是按照怎样的顺序运行的) 2,功能:(理解程序的作用) 3,试数:(我个人简单的理解为测试过程,把自己当作计算机去执行程序) /* 2012年4月20日 10:36:23 判断一个数是否是回文数 */ #include <stdio.h> int main(void) { int v

php找出指定范围内回文数且平方根也是回文数的方法

这篇文章主要介绍了php找出指定范围内回文数且平方根也是回文数的方法,实例分析了php判断回文的技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了php找出指定范围内回文数且平方根也是回文数的方法.分享给大家供大家参考.具体如下: 一.要求: 给出两个数值X和Y,统计在这个区间里的回文数,并且要求它们的平方根也是回文数.其中 1<= x <= y < 10 14 二.解决方法: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

PHP输出两个数字中间有多少个回文数的方法_php技巧

本文实例讲述了PHP输出两个数字中间有多少个回文数的方法.分享给大家供大家参考.具体分析如下: "回文数"是一种数字.如:98789, 这个数字正读是98789,倒读也是98789,正读倒读一样,所以这个数字就是回文数. <?php for($i=10;$i<100;$i++){ $len=strlen($i); $l=1; $k=intval($len)/2+1; for($j=0;$j<$k;$j++){ if (substr($i,$j,1)!=substr($

用while判断输入的数字是否回文数的简单实现_C 语言

复制代码 代码如下: /*  Name:用while判断输入的数字是否回文数   Copyright: By.不懂网络  Author: Yangbin  Date:2014年2月18日 04:29:07   Description:用while判断用户输入的数字是否回文数,是回文数返回YES!否则NO! */# include <stdio.h> int main(void){    int m,val,sum = 0;    printf("请输入一个回文数,如果是回文数返回YE

javascript-js判断五位数为回文数

问题描述 js判断五位数为回文数 用求余的方法判断一个五位数是否为回文数,num/10000%10,求具体代码 解决方案 function isPlain(num){ var first = parseInt(num/10000); var last = num%10; if(first == last && parseInt((num - first*10000)/1000) == parseInt((num-last)/10)%10){ return true; }else{ retu

求1O~1000之间的回文数

一个数是不是回文数,先将其数字分离,用一数组a存放,然后将相应数字进行比较.为此引入一标志变量flag,其值为1表示是回文数,为0表示不是回文数. 程序如下: /*程序8-1S,求lO~1000之间的回文数*/ main() {int i,X: int a[8],j: int b,e: int flag; for(i=10; i<1000l i++) {j=O:x=i;/*将数字分离,用一数组存放*/ while(x>O) {a[j]=x%10; x/=1O: j++: } flag=1:/*