在一行上输入四个整数
代表等待计算的数字。
如果可以通过规定的计算得到
,输出
,否则,直接输出
。
7 2 1 10
true
在这个样例中,
,因此输出
。
2 2 2 9
true
在这个样例中,
,因此输出
。
10 9 6 9
true
在这个样例中,
,因此输出
。
3 3 8 8
true
在这个样例中,
,因此输出
。
1 1 1 1
false
本题数据已进行加强(2025/01/09)。
#include <stdio.h>
double operation(double a, double b, int ch){
double res;
switch (ch) {
case '+':
res = a + b;
break;
case '-':
res = a - b;
break;
case '*':
res = a * b;
break;
case '/':
res = a / b;
break;
}
return res;
}
int digui(double* arr, int len){
if (len == 1){
if (arr[0] >= 23.9995 && arr[0] <= 24.0005)
return 1;
else
return 0;
}
int is_24 = 0;
for (int i = 0; i < len; i ++){
for (int j = 0; j < len; j ++){
if (i == j)
continue;
char ch[4] = {'+', '-', '*', '/'};
for (int ch_len = 0; ch_len < 4; ch_len ++){
double res = operation(arr[i], arr[j], ch[ch_len]);
double arr_new[len - 1];
int index = 0;
for (int n = 0; n < len; n ++){
if (n == i || n == j)
continue;
arr_new[index] = arr[n];
index ++;
}
arr_new[len - 2] = res;
is_24 = digui(arr_new, len - 1);
if (is_24 == 1){
return 1;
}
}
}
}
return is_24;
}
int main() {
double in[4];
scanf("%lf %lf %lf %lf", &in[0], &in[1], &in[2], &in[3]);
printf("%s\n", digui(in, 4) ? "true" : "false");
return 0;
} #include <stdint.h>
#include <stdio.h>
int dfs(float* a, int len) {
for (int i = 1; i <= 4; i++)
if (a[i] == 24)
return 1;
if (len == 1)return 0;
for (int i = 1; i <= 4; i++)
if (a[i] != -999)
for (int j = 1; j <= 4; j++)
if (i != j && a[j] != -999) {
float x, y;
x = a[i], y = a[j];
a[i] = x + y, a[j] = -999;
if (dfs(a, len - 1))return 1;
a[i] = x - y, a[j] = -999;
if (dfs(a, len - 1))return 1;
a[i] = x * y, a[j] = -999;
if (dfs(a, len - 1))return 1;
if (y != 0) {
a[i] = x / y, a[j] = -999;
if (dfs(a, len - 1))return 1;
}
a[i] = x, a[j] = y;
}
return 0;
}
int main() {
float a[10] = {0};
int n;
scanf("%f%f%f%f", &a[1], &a[2], &a[3], &a[4]);
if (dfs(a, 4))
printf("true");
else
printf("false");
return 0;
} #include <stdio.h>
float a[4],flag=0;
int use[4]={0};
void f(float p ,int x){
if(x==4) {
if(p==24) flag=1;
return;
}
for(int i=0; i<4 ;i++){
if(use[i]) continue;
else {
use[i]=1;
f(p+a[i],x+1);
f(p-a[i],x+1);
f(p*a[i],x+1);
if(a[i]) f(p/a[i],x+1);
f(a[i]-p,x+1);
if(p) f(a[i]/p,x+1);
use[i]=0;
}
}
}
int main() {
scanf("%f %f %f %f",a,a+1,a+2,a+3);
for(int i=0 ; i<4 ;i++){
use[i]=1;
f(a[i],1);
use[i]=0;
}
if(flag) printf("true\n");
else printf("false\n");
return 0;
递归
#include <stdio.h>
#include <math.h>
#define MAX 100000000.0
double calculate(double a, double b, int i) //a,b是操作数,与运算符+、-、*、/、结合共有6种情况
{
double sum[6] = {0};
sum[0] = a + b;
sum[1] = a - b;
sum[2] = b - a;
if(b != 0.0)
sum[3] = a / b;
else
sum[3] = MAX;
if(a != 0.0)
sum[4] = b / a;
else
sum[4] = MAX;
sum[5] = a * b;
return sum[i];
}
int dfs(double a[], int len)
{
if(len == 1 && fabs(a[0]-24) < 1e-6)
return 1;
double b[4] = {0};
for(int i=0; i<len-1; i++) //在长度为len的数组里任取两个数计算放入b[0]中,剩下的数字填入b[1]-b[3]里
{
for(int j=i+1; j<len; j++)
{
for(int k=0; k<6; k++) //计算有6种组合
{
int b_len = 0;
b[b_len++] = calculate(a[i], a[j], k); //计算结果放入b[0]中
for(int p=0; p<len; p++) //处理剩下未参与计算的数字
{
if(p != i && p != j)
b[b_len++] = a[p];
}
if(dfs(b,b_len))
return 1;
memset(b, 0, sizeof(b));
}
}
}
return 0;
}
int main() {
double a[4];
for(int i=0; i<4; i++)
{
int temp;
scanf("%d",&temp);
a[i] = temp*1.0;
}
if(dfs(a,4))
printf("true");
else
printf("false");
return 0;
} #include <stdio.h>
#include <math.h>
#define MAX 10001
int dfs(double num[])
{
int i,j,k,t=0,cnt=0;
double a,b;
for(i=0;i<4;i++)
{
if(num[i]!=MAX)
cnt++;
}
if(cnt==1)
{
for(i=0;i<4;i++)
{
if(num[i]!=MAX)
if(fabs(num[i]-24)<=1e-6)
return 1;
else
return 0;
}
}
else
{
for(i=0;i<4;i++)
{
if(num[i]!=MAX)
{
for(j=0;j<4;j++)
{
if(i==j||num[j]==MAX)
continue;
a=num[i];
b=num[j];
num[i]=a+b;
num[j]=MAX;
if(dfs(num))
return 1;
num[i]=a;
num[j]=b;
num[i]=a-b;
num[j]=MAX;
if(dfs(num))
return 1;
num[i]=a;
num[j]=b;
if(b!=0)
{
num[i]=a/b;
num[j]=MAX;
if(dfs(num))
return 1;
num[i]=a;
num[j]=b;
}
num[i]=a*b;
num[j]=MAX;
if(dfs(num))
return 1;
num[i]=a;
num[j]=b;
}
}
}
}
return 0;
}
int main()
{
int i,temp;
double num[4];
for(i=0;i<4;i++)
{
scanf("%d",&temp);
num[i]=temp*1.0;
}
if(dfs(num))
printf("true\n");
else
printf("false\n");
return 0;
}
只会笨方法
#include <stdio.h>
int flag=0;
// double n[4] = {0};
// double buf[4] = {0};
// 归的方式,每次只取两个数做加减乘除运算,并放回数组中,直到数据中只剩下一个数,判断这个数是否等于24*/
void is24( double *in, double sum, int step)
{
double a[3]={0};
if(flag==1)
return ;
else if(step==3)
{
if(sum==24)
flag =1;
return ;
}
else
{
step++;
for(int i=0;i<=4-step;i++)
{
for(int j=0;j<=4-step;j++)
{
if(i!=j)
{
int cnt = 1;
for(int z=0;z<=4-step;z++)
{
if(z!=i&&z!=j)
{
a[cnt] = in[z];
cnt++;
}
}
a[0] = in[i]+in[j];
is24(a,a[0],step);
a[0] = in[i]-in[j];
is24(a,a[0],step);
a[0] = in[i]*in[j];
is24(a,a[0],step);
a[0] = in[i]/in[j];
is24(a,a[0],step);
}
}
}
}
}
int main()
{
double n[4]= {0};
while(scanf("%lf %lf %lf %lf",&n[0],&n[1],&n[2],&n[3])!=EOF)
{
// double input[4];
// for(int i=0;i<4;i++)
// input[i] = n[i];
// int res = 0;
is24(n,0,0);
if(flag==1)
printf("true\n");
else
printf("false\n");
flag=0;
}
return 0;
}