编程之美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
#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]

Tags:

Add a Comment

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据