您的位置:首页 > 编程语言

关于"回文数"的编程实验(二)

2009-10-27 16:11 429 查看
关于回文数的形成,还有一个非常有趣的猜想如下:

 

 

  * 任取一个十进制整数,将其倒过来后与原来的整数相加,得到一个新的整数如果不是回文数,则重复以上步聚
  * 最终可得到一个回文数

回文数的这一形成规则目前还属于一个猜想,尚未得到数学上的证明。
下面这个小程序主要是验证这个猜想。用户可以输入任意一个正数,程序会不断使用上面的方式尝试产生一个回文数,或者直到程序的数据溢出(long long 类型)。
/*
*
* 任取一个十进制整数,将其倒过来后与原来的整数相加,得到一个新的整数后重复以上步聚,
* 则最终可得到一个回文数。请编程验证。
* 回文数的这一形成规则目前还属于一个猜想,尚未得到数学上的证明。
*
*/

#include <stdlib.h>
#include <iostream>
#include <iomanip>

using namespace std;

#define MAX_DIGITS 20

// check if this number is a palindrome number
// if yes, return -1
// othwise, return its reversed number
long long isPalindrome(long long num)
{
int digitCount = 0;
int digits[MAX_DIGITS];

do
{
digits[digitCount] = num % 10;
num = (num - digits[digitCount]) / 10;
digitCount++;
}
while(num != 0);

int j;
for(j=0; j < digitCount /2; j++)
{
if (digits[j] != digits[digitCount - j -1])
{
break;
}
}

if ( j == digitCount/2)
{
// it is a palindrome
return -1;
}
else
{
// try to return the reverse number
long long reversedNum = 0L;
for(int i=0; i<digitCount; i++)
{
reversedNum *= 10;
reversedNum += digits[i];
}
return reversedNum;
}
}

/*
*
*/
int main(int argc, char** argv) {
long long number;
while(true)
{
cout<<"/n/nPlease input a number ( -1 to quit ):";
cin>>number;
if (number == -1)
{
break;
}
long long reversedNum;
int round = 1;
while ((reversedNum = isPalindrome(number)) != -1L)
{
if (reversedNum < 0L)
{
cout<<"Data overflowed ! Quit /n"<<endl;
break;
}
long long sum = number + reversedNum;
cout<<setw(3)<<round<<": "<<number<<" + "<<reversedNum<<" = "<<sum<<endl;
round++;
number = sum;
}
}
return (EXIT_SUCCESS);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编程 input