(素数是这样的整数,它除了能表示为它自己和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
回文数猜想(算法)
最新推荐文章于 2023-05-16 21:00:33 发布