问题:
1.神奇的9位数,能不能找出符合如下条件的9位数?
这个数包括1~9这9个数字,这个9位数的前n位都能被n整除。假设这个9位数是abcdefghi
2.有这样一个乘法算式:人过大佛寺*我=寺佛大过人
这里面每一个汉字代表一个数字,并且不同汉字代表的数字不同,找出这些数字来?
问题1解法:
解法一:穷举9^9,然后使用剪枝避免不必要的运算,如b、d、f、h为奇数时就可以直接跳过,大大缩小了要检验的区间。
解法二:逻辑推理
a 可取1~9任何数
b 可取2 4 6 8
c 符合(a+b+c)能被3整除
d 可取2 4 6 8 且 cd能被4整除
e 可取5
f 可取2 4 6 8 且符合(a+b+c+d+e+f)被3整除
g 符合(abcd-efg)能被7整除
h 可取2 4 6 8 且符合(fgh)能被8整除
i 符合(a+b+c+d+e+f+g+h+i)被9整除
关于能被x整除的数的特征可以参考一下:能被x整除数的特征
a | 1 3 7 9 |
b | 2 4 6 8 |
c | 1 3 7 9 |
d | 2 4 6 8 |
e | 5 |
f | 2 4 6 8 |
g | 1 3 7 9 |
h | 2 4 6 8 |
i | 1 3 7 9 |
可以看出e比较特殊,从e有关的限制条件入手。
d+e+f要能被3整除,且e=5,所以d、f可能取值为:
d | f | d+e+f |
2 | 8 | 15 |
4 | 6 | 15 |
6 | 4 | 15 |
8 | 2 | 15 |
cd要被4整除,所以c、d可能取值为:
c | d |
1 | 2 |
1 | 6 |
3 | 2 |
3 | 6 |
7 | 2 |
7 | 6 |
9 | 2 |
9 | 6 |
到这一步可以确定d=2、6,f=8、4,再进一步判断条件“(fgh)能被8整除”
a | 1 3 7 9 |
b | 4 8 |
c | 1 3 7 9 |
d | 2 6 |
e | 5 |
f | 8 4 |
g | 1 3 7 9 |
h | 6 2 |
i | 1 3 7 9 |
还剩“(a+b+c)能被3整除”“(abcd-efg)能被7整除”没满足。
进一步的筛选出a不能选9,最后得到就381654729。
问题2解法:int main() { bool flag; bool IsUsed[10]; int number,revert_number,t,v; for (number =0;number < 100000;number++) { 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; }
http://blog.csdn.net/houhouzhe/article/details/6544669
第一个问题是N位回文数的个数是多少?
分析:N是奇数与偶数时,是两种不同的计算方式。先看偶数,
n1 n2 .. nm nm .. n2 n1
N = m * 2
取值范围 n1: 1 ~ 9
n2 - nm: 0 ~ 9
所以回文数f(N) = 9 * POW(10, N/2 - 1)
再看奇数,
n1 n2 .. nm nm+1 nm .. n2 n1
N = m * 2 + 1
由f(N)= 9 * POW(10, N/2 - 1) * 10
第二个问题:pow (he, 2) = she
看十进制,e可能的情况:0 , 1, 5, 6,
其实已经可以穷举了。再计算看看吧,能不能更有技术含量一点:
pow(he, 2) = (h * 10 + e) * (h * 10 + e) = 100 * h + 20 * e * h + e * e
e = 0: pow(he, 2) = 100 * h 可见十位必须是0,没有可选解
e = 1: pow(he, 2) = 100 * h + 20 * h + 1 = 120 * h + 1 = 100 * s + h * 10 + 1 => 110 * h = 100 * s, 没有可选解
e = 5: pow(he, 2) = 100 * h + 100 * h + 25 = 200 * h + 25 = 100 * s + h * 10 + 5 => 190h + 20 = 100 * s
可以得到解 (h = 2, s = 4)
e = 6: pow(he, 2) = 100 * h + 120 * h + 36 = 100 * s + h * 10 + 6 => 210 * h + 30 = 100 * s
可以得到解 (h = 7, s = 15),但是s大于9,不是一个合理解。
因此解是:pow(25, 2) = 625。