凑算式
A + --- + ------- = 10
C GHI
(如果显示有问题,可以参见【图1.jpg】)
这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。
就一个控制精度问题,其他的没有了。
答案 : 29
第一种:dfs,搜索每一个位置,确定当前的数,最后统一计算(终于自己都看不下去以前写的无穷for了QAQ)
源代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<string> #include<algorithm> int flag[11]; int ans[11]; int sum=0; using namespace std; void dfs(int pos) { if(pos==10) { double t1=(double)ans[1]; double t2=((double)ans[2])/((double)ans[3]); double t3=((double)(ans[4]*100+ans[5]*10+ans[6]))/((double)(ans[7]*100+ans[8]*10+ans[9])); double result=t1+t2+t3; if(fabs(result-10.0)<=1e-8) { sum++; } return; } for(int i=1;i<=9;++i) { if(!flag[i]) { ans[pos]=i; flag[i]=1; dfs(pos+1); flag[i]=0; } } } int main() { memset(flag,0,sizeof(flag)); memset(ans,0,sizeof(ans)); dfs(1); printf("%d ",sum); return 0; }
第二种:暴力for循环(直接跳过吧)
源代码:
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<string> #include<string.h> #include<math.h> #include<map> #include<vector> #include<algorithm> #include<queue> using namespace std; #define MAX 0x3f3f3f3f #define MIN -0x3f3f3f3f #define PI 3.14159265358979323 #define N 1005 int main() { int a, b, c, d, e, f, g, h, i; int sum = 0; for (a = 1; a <= 9; a++) { for (b = 1; b <= 9; b++) { if (b == a) continue; for (c = 1; c <= 9; c++) { if (c == b || c == a) continue; for (d = 1; d <= 9; d++) { if (d == a || d == b || d == c) continue; for (e = 1; e <= 9; e++) { if (e == a || e == b || e == c || e == d) continue; for (f = 1; f <= 9; f++) { if (f == a || f == b || f == c || f == d || f == e) continue; for (g = 1; g <= 9; g++) { if (g == a || g == b || g == c || g == d || g == e || g == f) continue; for (h = 1; h <= 9; h++) { if (h == a || h == b || h == c || h == d || h == e || h == f || h == g) continue; for (i = 1; i <= 9; i++) { if (i == a || i == b || i == c || i == d || i == e || i == f || i == g || i == h) continue; else { if (fabs(a*1.0 + b*1.0 / c + (d * 100 + e * 10 + f)*1.0 / (g * 100 + h * 10 + i) - 10.00) < 0.0000000001) { sum++; printf("%d%d%d%d%d%d%d%d%d ", a, b, c, d, e, f, g, h, i); printf("%.6lf ", a*1.0 + b*1.0 / c + (d * 100 + e * 10 + f)*1.0 / (g * 100 + h * 10 + i)); } } } } } } } } } } } printf("%d ", sum); return 0; }