/* 先求出一百万内所有回文数,放入num[1998]中
再求每个数的二进制是不是回文数。*/
#include <iostream>
#include <Windows.h>
#include <iomanip>
using namespace std;
int palindromes(int n)
{
int digit = 0;
int t = n;
int num[7] = { 0 };
int ok = 1;
while (t > 0)
{
num[digit] = t % 10;
t /= 10;
++digit;
}
int p = digit - 1;//后指针,从后面指向数组
for (int i = 0; i < (digit + 1) / 2; ++i)
{
if (num[i] != num[p])
{
ok = 0;
break;
}
--p;
}
return ok;
}
int main()
{
DWORD s = GetTickCount();
{
int count = 0;
int sum = 0;
int num[1998];
for (int i = 1; i <= 1000000; ++i)
{
if (palindromes(i))
{
num[count] = i;
count++;
}
}
for (int i = 0; i < 1998; ++i)
{
unsigned x;
int ok = 1;
int p=0 ;
int digit[20];
if (!num[i]) cout << '0';
else
{
for (x = 0x80000000; !(x&num[i]); x >>= 1);
for (; x; x >>= 1)
{
digit[p] = (x&num[i] || 0);
p++;
}
}
int t = p;
for (int i = 0; i < (p + 1) / 2; ++i)
{
if (digit[i] != digit[t - 1])
{
ok = 0;
break;
}
--t;
}
if (ok)
{
cout << num[i] << endl;
sum += num[i];
}
}
cout << endl << "the sum is " << sum << endl;
}
DWORD e = GetTickCount();
cout << "The running time is " << e - s << " ms" << endl;
system("pause");
}