关于回文数的形成,还有一个非常有趣的猜想如下: * 任取一个十进制整数,将其倒过来后与原来的整数相加,得到一个新的整数如果不是回文数,则重复以上步聚 * 最终可得到一个回文数 回文数的这一形成规则目前还属于一个猜想,尚未得到数学上的证明。 下面这个小程序主要是验证这个猜想。用户可以输入任意一个正数,程序会不断使用上面的方式尝试产生一个回文数,或者直到程序的数据溢出(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); }