编程之美4.10 数字哑谜和回文问题
1.有这样一个乘法算式:
人过大佛寺*我=寺佛大过人
这里面每一字都代表着一个数字,并且不同的字代表着的数字不同,找出这些数字来。
代码:
[cc lang=”C++”]
#include
#include
int main()
{
bool flag;
bool IsUsed[10];
int number,revert_number,t,v;
for (number =0;number < 100000;number++)//从0开始查找
{
flag =true;
memset(IsUsed,0,sizeof(IsUsed));
t=number;
revert_number=0;
for (int i=0;i<5;++i)//得到翻转数字
{
v=t%10;
revert_number= revert_number* 10 +v;
t/=10;
if(IsUsed[v]) //确保没有重复的数字,有重复的下面检验直接跳过
flag=false;
else
IsUsed[v]=1;
}
if (flag && (revert_number % number == 0))//没有重复数字且没有余数
{
v=revert_number /number;
if (v<10 && !IsUsed[v])
{
printf("%d * %d = %d\n",number,v,revert_number);
}
}
}
return 0;
}
[/cc]
输出结果:21978 * 4 = 87912
2.在两位数中,回文数有11,22,33,...,99;在三位数中,有111,121,131,...,222...。那么N位回文数的个数总共有多少呢?
此题目需要根据数字位数是奇数还是偶数来判断,当位数是偶数时,需要保证前半部和后半部是一一对应的;如果是奇数,则以中间数为分割,左右对应。试着写一下代码如下:
[cc lang="C++"]
include
#include
#include
#include
using namespace std;
int get_loop_count(int digit_num)
{
int max_num = pow(10, digit_num);
int min_num = pow(10, digit_num-1);
int result_num = 0;
if(digit_num %2 ==1 )//当前数字是奇数位
{
for(int index = min_num; index < max_num; index ++)//遍历每一个数字
{
string digit_str = to_string(index);
int low =0;
int high = digit_num -1;
bool flag = true;
int mid = (digit_num -1)/2;
while(low < mid && high > mid)
{
if(digit_str[low] != digit_str[high])
{
flag = false;
break;
}
low ++;
high –;
}
if(flag)
{
cout << "回文数字:" << index << endl;
result_num += 1;
}
}
}else//数字是偶数位
{
for(int index = min_num; index < max_num; index ++)//遍历每一个数字
{
string digit_str = to_string(index);
int low =0;
int high = digit_num -1;
bool flag = true;
while(low < high)
{
if(digit_str[low] != digit_str[high])
{
flag = false;
break;
}
low ++;
high --;
}
if(flag)
{
result_num += 1;
cout << "回文数字:" << index << endl;
}
}
}
return result_num;
}
int main()
{
get_loop_count(3);
return 0;
}
[/cc]