CSUOJ 1600 Twenty-four point (判断24点,另附给出表达式版)

68 篇文章 4 订阅
66 篇文章 0 订阅


1600: Twenty-four point

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 296   Solved: 38
[ Submit][ Status][ Web Board]

Description

Given four numbers, can you get twenty-four through the addition, subtraction, multiplication, and division? Each number can be used only once.

Input

The input consists of multiple test cases. Each test case contains 4 integers A, B, C, D in a single line (1 <= A, B, C, D <= 13).

Output

For each case, print the “Yes” or “No”. If twenty-four point can be get, print “Yes”, otherwise, print “No”.

Sample Input

2 2 3 9
1 1 1 1 
5 5 5 1

Sample Output

Yes
No
Yes

HINT

For the first sample, (2/3+2)*9=24.


题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1600

题目大意:给四个数判断能否算出24

题目分析:直接DFS爆搜,每次计算两个数字再放进数组,知道数组里只有一个数为止


#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
double EPS = 1e-10;
double num[4];
bool flag;

bool equel(double a, double b)
{
	if(fabs(a - b) <= EPS)
		return true;
	return false;
}

void DFS(int n)
{
	if(flag || (n == 1 && equel(num[0], 24)))
	{
		flag = true;
		return;
	}
	for(int i = 0; i < n; i++)
	{
		for(int j = i + 1; j < n; j++)
		{
			double c1 = num[i], c2 = num[j];
			num[j] = num[n - 1];
			num[i] = c1 + c2;
			DFS(n - 1);
			num[i] = c1 - c2;
			DFS(n - 1);
			num[i] = c2 - c1;
			DFS(n - 1);
			num[i] = c1 * c2;
			DFS(n - 1);
			if(!equel(c2, 0))
			{
				num[i] = c1 / c2;
				DFS(n - 1);
			}
			if(!equel(c1, 0))
			{
				num[i] = c2 / c1;
				DFS(n - 1);
			}
			num[i] = c1;
			num[j] = c2;
		}
	}
}

int main()
{
	while(scanf("%lf %lf %lf %lf", &num[0], &num[1], &num[2], &num[3]) != EOF)
	{
		flag = false;
		DFS(4);
		printf("%s\n", flag ? "Yes" : "No");
	}
}


另外考虑,输出解的个数和所有解的方法,其实只要用字符串记录一下就可以了


#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
#include <string>
using namespace std;
double EPS = 1e-10;
double num[4];
bool flag;
int cnt;
string re[4];

bool equel(double a, double b)
{
	if(fabs(a - b) <= EPS)
		return true;
	return false;
}

void DFS(int n)
{
	if(n == 1 && equel(num[0], 24))
	{
		cnt ++;
		cout << re[0] << endl;
		return;
	}
	for(int i = 0; i < n; i++)
	{
		for(int j = i + 1; j < n; j++)
		{
			double c1 = num[i], c2 = num[j];
			string re1, re2;
			num[j] = num[n - 1];
			num[i] = c1 + c2;
			re1 = re[i];
			re2 = re[j];
			re[j] = re[n - 1];
			re[i] = '(' + re1 + '+' + re2 + ')';
			DFS(n - 1);
			num[i] = c1 - c2;
			re[i] = '(' + re1 + '-' + re2 + ')';
			DFS(n - 1);
			num[i] = c2 - c1;
			re[i] = '(' + re2 + '-' + re1 + ')';
			DFS(n - 1);
			num[i] = c1 * c2;
			re[i] = '(' + re1 + '*' + re2 + ')';
			DFS(n - 1);
			if(!equel(c2, 0))
			{
				num[i] = c1 / c2;
				re[i] = '(' + re1 + '/' + re2 + ')';
				DFS(n - 1);
			}
			if(!equel(c1, 0))
			{
				num[i] = c2 / c1;
				re[i] = '(' + re2 + '/' + re1 + ')';
				DFS(n - 1);
			}
			num[i] = c1;
			num[j] = c2;
			re[i] = re1;
			re[j] = re2;
		}
	}
}

int main()
{
	while(scanf("%lf %lf %lf %lf", &num[0], &num[1], &num[2], &num[3]) != EOF)
	{
		re[0] = num[0] + '0';
		re[1] = num[1] + '0';
		re[2] = num[2] + '0';
		re[3] = num[3] + '0';
		cnt = 0;
		DFS(4);
		printf("Answer num: %d\n", cnt);
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hive 中可以使用 UDF(User-Defined Functions)来实现将数字转化为英文格式的功能。以下是一个示例 UDF 的代码实现: ```java import org.apache.hadoop.hive.ql.exec.UDF; import java.text.DecimalFormat; public class NumberToEnglish extends UDF { private static final String[] tensNames = {"", " ten", " twenty", " thirty", " forty", " fifty", " sixty", " seventy", " eighty", " ninety"}; private static final String[] numNames = {"", " one", " two", " three", " four", " five", " six", " seven", " eight", " nine", " ten", " eleven", " twelve", " thirteen", " fourteen", " fifteen", " sixteen", " seventeen", " eighteen", " nineteen"}; private static final String[] bigNames = {"", " thousand", " million", " billion"}; public String evaluate(Double num) { if (num == 0) { return "zero"; } DecimalFormat decimalFormat = new DecimalFormat("#.00"); String formatted = decimalFormat.format(num); String[] parts = formatted.split("\\."); long dollars = Long.parseLong(parts[0]); int cents = Integer.parseInt(parts[1]); String dollarsInEnglish = convert(dollars); String centsInEnglish = convert(cents); String result = dollarsInEnglish + " dollars"; if (cents != 0) { result += " and " + centsInEnglish + " cents"; } return result.trim(); } private static String convert(long num) { if (num == 0) { return "zero"; } String prefix = ""; if (num < 0) { num = -num; prefix = "negative"; } String current = ""; int place = 0; do { long n = num % 1000; if (n != 0) { String s = convertLessThanOneThousand((int) n); current = s + bigNames[place] + current; } place++; num /= 1000; } while (num > 0); return (prefix + current).trim(); } private static String convertLessThanOneThousand(int num) { String current; if (num % 100 < 20) { current = numNames[num % 100]; num /= 100; } else { current = numNames[num % 10]; num /= 10; current = tensNames[num % 10] + current; num /= 10; } if (num == 0) { return current; } return numNames[num] + " hundred" + current; } } ``` 这个 UDF 接受一个 Double 类型的参数,然后将其转化为英文格式的字符串。在这个 UDF 中,我们使用了一个叫做 `convert()` 的函数来将数值转化为英文形式。这个函数将数值按照千位进行分组,然后对每一组的数值进行转化,最后将所有组的结果拼接起来。 例如,要将 USD24,217.45 转化为英文格式,可以使用如下的 HiveQL 语句: ```sql SELECT NumberToEnglish(24217.45); ``` 上面的语句将返回字符串 "twenty-four thousand two hundred seventeen dollars and forty-five cents"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值