问题:
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解法:
#include <string.h> #include <stdio.h> 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; } //21978 * 4 = 87912 //请按任意键继续. . .