蓝桥杯第七届C/C++B省赛凑算式

China☆狼群 提交于 2020-03-15 05:45:23
第三题:

凑算式


       B      DEF
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\n",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\n", a, b, c, d, e, f, g, h, i);
												printf("%.6lf\n", a*1.0 + b*1.0 / c + (d * 100 + e * 10 + f)*1.0 / (g * 100 + h * 10 + i));
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}
	printf("%d\n", sum);
	return 0;
}


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!