回文数猜想(算法)

(素数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任
何其它两个整数的乘积。例如,15=3*5,所以15不是素数;又如,12
=6*2=4*3,所以12也不是素数。另一方面,13除了等于13*1以
外,不能表示为其它任何两个整数的乘积,所以13是一个素数)

回文数猜想
  

  我国古代有一种回文诗,倒念顺念都有意思,例如“人过大佛寺”,倒读起来便是“寺佛大过人”。还有经典的对联“客上天然居,居然天上客”。此种例子举不胜举。在自然数中也有类似情形,比如1991就是一个很特殊的四位数,从左向右读与从右向左读竟是完全一样的,这样的数称为“回文数”。这样的年份,在20世纪是仅有的一年。过了1991年,需要再过11年,才能碰到第二个回文数2002。

  例如,人们认为,回文数中存在无穷多个素数11,101,131,151,191……。除了11以外,所有回文素数的位数都是奇数。道理很简单:如果一个回文素数的位数是偶数,则它的奇数位上的数字和与偶数位上的数字和必然相等;根据数的整除性理论,容易判断这样的数肯定能被11整除,所以它就不可能是素数。

  人们借助电子计算机发现,在完全平方数、完全立方数中的回文数,其比例要比一般自然数中回文数所占的比例大得多。例如11^2=121,22^2=484,7^3=343,11^3=1331,11^4=14641……都是回文数。

  人们迄今未能找到五次方,以及更高次幂的回文数。于是数学家们猜想:不存在nk(k≥5;n、k均是自然数)形式的回文数。

  在电子计算器的实践中,还发现了一桩趣事:任何一个自然数与它的倒序数相加,所得的和再与和的倒序数相加,……如此反复进行下去,经过有限次步骤后,最后必定能得到一个回文数。

  这也仅仅是个猜想,因为有些数并不“驯服”。比如说196这个数,按照上述变换规则重复了数十万次,仍未得到回文数。但是人们既不能肯定运算下去永远得不到回文数,也不知道需要再运算多少步才能最终得到回文数

dev-c++中通过调试
//判断一个数是否为回文数
#include<stdio.h>
#include<iostream>
int main()
{
int s[20],i,j,k;
long in;
scanf("%ld",&in);
for(j=1;in>0;j++)
{
s[j]=in%10;
in/=10;
}
for(i=1;i<j/2;i++)
{
if(s[i]!=s[j-i]){printf("NO");break;}
   else
k=1;
}
if(k==1)
printf("YES");
system("pause");
return 0;
}

改变循环条件:

i=1;
for(j--;i<j;i++,j--)

{  
   if(s[i]!=s[j]){printf("NO");break;}
     else k=1;

}


可以不定义变量k
for(j--;i<j;i++,j--)

   if(s[i]!=s[j]){printf("NO");break;}
   if(i>=j) printf(“YES”);



#include<iostream>
#include<stdlib.h>
using namespace std;

int huiwen(int input)
{  int temp=0;
      for(int i=input;i>0;i/=10)
  temp=temp*10+i%10;
return temp;
}

int main()
{  int x;
   cout<<"input x:";
   cin>>x;
   cout<<endl;
   int huiwen(int x);
   if(huiwen(x)==x)
     cout<<"shi hui wen shu"<<endl;
  else cout<<"bu shi hui wen shu"<<endl;
   system("pause");
   return 0;
}




打印所有不超过
n(取n<256) 的其平方具有对称性质的数(也称回文数)。
*题目分析与算法设计
对于要判断的数n,计算出其平方后(存于a),将a的每一位进行分解,再按a的从低到高的顺序将其恢复成一个数k(如n=13,则a=169且k=961),若a等于k则可判定n为回亠数。
*程序说明与注释

(如果读者还发现错误请提出):
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
    int m[16],n,i,t,count=0;
    long unsigned a,k;
    printf("No. number it's square(palindrome)/n");
    for(n=1;n<256;n++) /*穷举n的取值范围*/
    {
        k=0;t=1;a=n*n; /*计算n的平方*/
        
        for(i=0;a!=0;i++) /*从低到高分解数a的每一位存于数组m[0]~m[16]*/
        {
            m=a%10;//这个是取得a的个位,整个循环合起来就可以取得各个位
            a/=10;
        }
        
        int j=0;
        for(i--;j<i;j++,i--)//因为n的平方的各个位都存在数组中了,下面判断是不是对称
            if(m[j]!=m)break;//只要有一位不是对称,那就说明不是对称,就可以退出了
        //所有的位都对称就说明是对称了,这样就可以打印出结果了
        if(j>=i)printf("%2d%10d%10d/n",++count,n,n*n);
}
system("pause");
    return 0;
}
*运行结果
No. number it's square(palindrome)
1 1 1
2 2 4
3 3 9
4 11 121
5 22 484
6 26 676
7 101 10201
8 111 12321
9 121 14641
10 202  40804
11 212 44944

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值