第二章 暴力求解(枚举法)
第一节 小学奥数题—程序求解
观察下面的加法算式:
祥 瑞 生 辉
+ 三 羊 献 瑞
三 羊 生 瑞 气
其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字,且“三”字不为 0 。
请计算所有的汉字代表什么意思。
这是一道经典的小学奥数题,相信有不少同学曾经遇到过类似的题目,如果单纯的笔算将花费大量的时间,而暴力求解则可以利用计算机快速得出结果。而且不需要思考任何数字的可能值。
给出代码,大家自己体会:
#include<stdio.h>
int main() {
int a,b,c,d,e,f,g,h; // 由a-h分别代表汉字:祥 瑞 生 辉 三 羊 献 气
for(a=0;a<10;a++) {
for(b=0;b<10;b++) {
for(c=0;c<10;c++) {
for(d=0;d<10;d++) {
for(e=1;e<10;e++) { // e 代表汉字 “三 ”,其不为 0 ,所以初始化为 1
for(f=0;f<10;f++) {
for(g=0;g<10;g++) {
for(h=0;h<10;h++) {
int n = a*1000+b*100+c*10+d;
int m = e*1000+f*100+g*10+b;
int k = e*10000+f*1000+c*100+b*10+h;
int l = n+m;
if(k==l && a!=b && a!=c && a!=d && a!=e && a!=f && a!=g && a!=h && b!=c && b!=d && b!=e && b!=f && b!=g && b!=h && c!=d && c!=e && c!=f && c!=g && c!=h && d!=e && d!=f && d!=g && d!=h && e!=f && e!=g && e!=h && f!=g && f!=h && g!=h) {
printf("%d,%d,%d\n",n,m,k);
printf("祥=%d,瑞=%d,生=%d,辉=%d,三=%d,羊=%d,献=%d,气=%d\n",a,b,c,d,e,f,g,h);
}}}}}}}}}
return 0;
}
暴力题很烦,只给出一道例题,以后如果有好的题,再写出来吧。
附:诗
浣溪沙
——纳兰性德
谁念西风独自凉,萧萧黄叶闭疏窗,沉思往事立残阳。
被酒莫惊春睡重,赌书消得泼茶香,当时只道是寻常。
以上。