道可道,非常道

无名者,圣人也
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[原创]回文数的一些研究

Posted on 2008-03-19 10:09  一岩一道  阅读(800)  评论(0编辑  收藏  举报
定义:如果将某个自然数的各位数字顺序倒过来,得到的数仍为它本身,则称这个自然数为回文数。
例如1331,11,2332这样的自然数。
转载请注明出处。
1.回文数的判断
利用定义,将数n的各位顺序颠倒后的数convser_n与n比较,如果相等,则n是回文数。
算法:
        public bool IsPalind(int n)
        
{
            
int converse_n = 0;
            
int m=0;
            
while(n>0)
            
{
                m 
= n % 10//取余,获得n的低位
                n = n / 10//整除,截断n
                converse_n = m + converse_n * 10//累加,生成converse_n
            }

            
if (converse_n != n)
            
{
                
return false;
            }

            
else
            
{
                
return true;
            }

        }

2.给定一个数和位数,生成其对应得回文数。
    例如给定32,对应位数为4,生成的回文数应为3224。
    又如给定32,对于位数为3,生成的回文数应为323。
相应算法如下:
其中n为给定的数,len为位数。
        public int MakePalind(int n,int len)
        
{
            
int m, a, t, r, k;
            k 
= n;
            m 
= 0; a = 1; t = 0;
            
if (len % 2 != 0)
            
{
                n 
= n / 10;
                
if (n == 0)
                    
return k;
            }

            
while (n != 0)
            
{
                m 
= n % 10;
                n 
= n / 10;
                t 
= t * 10 + m;
                a 
*= 10;
            }

            r 
= k * a + t;
            
return r;
        }


3.生成任意位数内的所有回文数,比如所有4位数的回文数。
分析:
    1).对于位数为奇数如3位数的回文数101,我们通过10->99来构造101->999.
    2). 对于位数为偶数如4为回文数1001,同样可以10->99来构造1001->9999
    3).可以发现3位数的基100等于10的(3/2)次方。(计算机里整除3/2=1)而四位数的基为10的((4-1)/2)次方。
    很容易得到n位数回文数的循环范围为10^(n-1)/2到10^(n+1)/2-1。然后就利用上一小节所用的给定数和位数构造回文数。
代码如下:
        public void CreatePalind(int n)
        
{
            
int len = n;
            n 
= (n + 1/ 2;
            
int baseNum = 1;
            
for (int i = 0; i < n; i++)
            
{
                baseNum 
= baseNum * 10;
            }

            
//int j = 0;
            for (int i = baseNum / 10; i < baseNum; i++)
            
{
                
if (i % 10 == 0)
                
{
                    Console.WriteLine();
                }

                
long pp = Convert.ToInt32(this.MakePalind(i, len));
                Console.Write(pp 
+ " ");
            }

        }