首页 > 试题广场 >

计算糖果

[编程题]计算糖果
  • 热度指数:26857 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
A,B,C三个人是好朋友,每个人手里都有一些糖果,我们不知道他们每个人手上具体有多少个糖果,但是我们知道以下的信息:
A - B, B - C, A + B, B + C. 这四个数值.每个字母代表每个人所拥有的糖果数.
现在需要通过这四个数值计算出每个人手里有多少个糖果,即A,B,C。这里保证最多只有一组整数A,B,C满足所有题设条件。

输入描述:
输入为一行,一共4个整数,分别为A - B,B - C,A + B,B + C,用空格隔开。 范围均在-30到30之间(闭区间)。


输出描述:
输出为一行,如果存在满足的整数A,B,C则按顺序输出A,B,C,用空格隔开,行末无空格。 如果不存在这样的整数A,B,C,则输出No
示例1

输入

1 -2 3 4

输出

2 1 3
#include<iostream>
using namespace std;

int main()
{   int a, b, c, d;
    int A, B, C;
	while(cin>>a>>b>>c>>d)
	{
		A=(a+c)/2;
		B=(b+d)/2;
		C=(d-b)/2;
		if(A-B==a && B-C==b && A+B==c && B+C==d)
		{
			cout<<A<<" "<<B<<" "<<C<<endl;
		}
		else
		{
			cout<<"No"<<endl;
		}
	}
    return 0;
}

//由于涉及到除法,得到的结果A,B,C有可能是截断后的数据,不妨逆推回去验算一遍,假如与原方程相符合,则正确

编辑于 2017-08-11 17:03:35 回复(2)
// 要求ABC都为整数
// 注意多了一个约束条件,即四个式子解3个未知数,所以还要确定满不满足A+B==n3

import java.util.Scanner;
public class Main {	
	public static void main(String[] args){
		Scanner in = new Scanner(System.in);
		int n1 = in.nextInt();
		int n2 = in.nextInt();
		int n3 = in.nextInt();
		int n4 = in.nextInt();
		int A = (n1+n3)/2;
		int B = (n2+n4)/2;
		int C = B-n2;
		if((n1+n3)%2==0&&(n2+n4)%2==0&&(A+B==n3)){
			System.out.println(A+" "+B+" "+C);
		}else{
			System.out.println("No");
		}
	}
}
 

编辑于 2017-07-03 22:21:53 回复(0)
#include<iostream>
using namespace std;
int main(){
    float a,b,c,d;
    float A,B,C;
    cin>>a>>b>>c>>d;
    A=(a+c)/2;
    B=c-A;
    C=B-b;
    if(A>=0&&B>=0&&C>=0&&B+C==d&&(A-(int)A)==0&&(B-(int)B)==0&&(C-(int)C)==0)
        cout<<A<<" "<<B<<" "<<C<<endl;
    else
        cout<<"No"<<endl;
由A-B和A+B可以计算得到A,B,再由B-C得到C,验证A,B,C都为正整数且满足B+C的条件,则输出,设置为A,B,C为浮点型是为了在求解ABC的时候不至于被四舍五入。
发表于 2016-09-13 09:11:58 回复(0)
#include<iostream>
using namespace std;
int main()
{
    int x1, x2, x3, x4;
    cin >> x1 >> x2 >> x3 >> x4;
    if(x1+x2+x4 != x3)//判断是否无解-自相矛盾
        cout << "No" << endl;
    else
    {
        int B = (x2+x4) / 2;
        if(2*B != (x2+x4))//判断是否为非整数解
        {
            cout << "No" << endl;
        }
        else
        {
            int A = B + x1;
            int C = B - x2;
            cout << A << " " << B  << " "<< C << endl;
        }
    }
}

发表于 2018-09-12 16:04:34 回复(0)
增广矩阵要有唯一解,要求r(A|b) = r(A),可以得到一个式子,不等于0时则没有唯一解。满足则可以
根据阶梯矩阵求解A B C。
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int M = scanner.nextInt();
        int N = scanner.nextInt();
        int P = scanner.nextInt();
        int Q = scanner.nextInt();
        if (M - P + N + Q != 0) {
            System.out.println("No");
        }else {
            int A = P - (N + Q) / 2;
            int B = (N + Q) / 2;
            int C = (Q - N) / 2;
            System.out.println(A + " " + B + " " + C);
        }
    }
}

发表于 2018-05-25 00:34:00 回复(1)

python四行解法

這道題很簡單,不過要注意算出來的值不能爲負數,不能是小數。

i1, i2, i3, i4 = map(int, input().split())
a = (i1 + i3) // 2 if (i1 + i3) % 2 == 0 and (i1 + i3) >= 0 else None
b = (i2 + i4) // 2 if (i2 + i4) % 2 == 0 and (i2 + i4) >= 0 else None
print(" ".join(map(str, [a, b, i4 - b])) if isinstance(a, int) and isinstance(b, int) else "No")
编辑于 2018-04-13 10:04:26 回复(0)
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> vec(4);
    int a, b, c;
    for(int i = 0; i < 4; ++i)
    {
        cin >> vec[i];
    }
    a = (vec[0] + vec[2])/2;
    b = (vec[1] + vec[3])/2;
    c = (vec[3] - vec[1])/2;
    if( ((a-b) == vec[0]) && ((b-c) == vec[1]) && ((a+b) == vec[2])
          && ((b+c) == vec[3]) )
        cout << a << " " << b << " " << c << endl;
    else 
        cout << "No" << endl;
    return 0;
}
发表于 2021-04-23 11:19:32 回复(0)
#include<stdio.h>
int main()
{
    int A,B,C,a,b,c,d;
    scanf("%d%d%d%d",&a,&b,&c,&d);
    A = (a+c)/2;
    B = (a-c)/(-2);
    C = (b-d)/(-2);
    if(B == (b+d)/2)
        printf("%d %d %d",A,B,C);
    else
        printf("No");
}

发表于 2020-01-10 15:06:16 回复(0)

python 2 line solution

a, b, c, d = list(map(int,input().strip().split()))
print((a+c)//2,(b+d)//2,(d-b)//2) if c-a == b+d else print('No')
编辑于 2019-08-02 21:42:42 回复(0)
#include<stdio.h>
int main()
{
 int n1,n2,n3,n4,A1,B1,C1;
 float A,B,C;
 scanf("%d %d %d %d",&n1,&n2,&n3,&n4);
 A=(n1+n3)/2.0;
 B=(n2+n4)/2.0;
 C=n4-B;
 A1=(int)A;
 B1=(int)B;
 C1=(int)C;
 if((A1==A)&&(B1==B)&&(C1==C)&&(A1>=0)&&(B1>=0)&&(C1>=0)) 
 printf("%d %d %d",A1,B1,C1);
 else 
 printf("No");
 return 0;
}

发表于 2018-09-27 11:33:04 回复(0)
<?php
//输入1 -2 3 4
//输出 2 1 3
$arr = explode(' ',trim(fgets(STDIN)));
$a = ($arr[0]+$arr[2])/2; //A-B+A+B = 2A =1+3=4   A=2
$b = ($arr[1]+$arr[3])/2; //B-C+B+C = 2B =-2+4=2  B=1
$c = $arr[3]-$b;  // B+C=4  C=4-B
//糖果数必须是大于等于0的整数
if(!is_int($a*$b*$c)||$a<0||$b<0||$c<0)
    echo 'No';
else
    echo "$a $b $c";

发表于 2018-07-23 22:10:39 回复(0)
def isOK(x):
    if x < 0: return False
    if int(x) == x:  #是否是小数
        return True

line = raw_input()
data = line.strip().split(" ")
data = map(int,data)

d0 = data[0]
d1 = data[1]
d2 = data[2]
d3 = data[3]

#求解A、B、C
A  = 0.5 * (d2 + d0)
B1 = 0.5 * (d2 - d0)
C  = 0.5 * (d3 - d1)
B2 = 0.5 * (d3 + d1)  #B1、B2为B的两种算法,必须一致才能满足要求

if isOK(A) and isOK(B1) and isOK(C) and (B1 == B2):
    A = int(A)
    B1= int(B1)
    C = int(C)
    print str(A) +" " + str(B1) + " " + str(C)
else:
    print "No"

发表于 2018-05-22 17:45:44 回复(0)
import java.util.Scanner;
public class Main{
    public static void main(String args[]){
        int result1,result2,result3,result4;
        Scanner sc = new Scanner(System.in);
        result1 = sc.nextInt();
        result2 = sc.nextInt();
        result3 = sc.nextInt();
        result4 = sc.nextInt();
        int A,B,C;
        if((result1+result3)%2==0){
            A=(result1+result3)/2;
            B=result3-A;
            C=result4-B;
            if(result1==A-B && result2==B-C && result3==A+B && result4==B+C){
                System.out.print(A+" "+B+" "+C);
            }else{
                System.out.print("No");
            }
        }else{
            System.out.print("No");
        }
    } 
}

编程经验不够,所以用的是最简单的方法去实现。希望帮助跟我一样基础不太好的人。
1、最开始想的是直接把键盘获得的值赋值给A+B,A-B,B-C,B+C,但是不行,所以通过result1,result2,result3,result4四个中间值进行赋值。所以解出A、B、C的值的过程就类似于解方程式, 故A=(result1+result3)/2, B=result3-AC=result4-B。
2、第二个人难点怎么判断解出的值是整型,因为按1中方程式的解法,B的值与A有关,C的值与B有关,输入的值都是整型,那么如果得出的A的值为整型,那么B与C的值也为整型。A的值为(result1+result3)/2,判断A是不是为整型,则只需要判断(result1+result3)%2是否为0即可。如果是整型,那么依次求出ABC的值,如果不是则输出 No。
3、判断语句if中的嵌套if是因为,保存测试程序时,测试系统给了四个值,按1中方法可以解出ABC的值,但是把解出的ABC的值带入A+B,B-C,B+C时,值可以对应上result1、result3、result4,但是A-B对应不上result2的值。所以解出的ABC值进行A+B,A-B,B-C,B+C运算时,值应当全部需要与result1、result2、result3、result4对应上才可以。
编辑于 2018-05-07 10:29:32 回复(1)
//根据代数式特点,直接用消元法可以得到结果
#include<iostream>
using namespace std;
int main(){
    int a,b,c,d;
    cin>>a>>b>>c>>d;
    int A=(int)(a+c)/2;
    int B=(int)(b+d)/2;
    int C=(int)(d-b)/2;
    if(A-B==a&&B-C==b&&A+B==c&&B+C==d){
        cout<<A<<" "<<B<<" "<<C<<endl;
    }
    else
        cout<<"No"<<endl;
    return 0;
}
发表于 2018-03-16 16:02:17 回复(0)
#include<stdio.h>
int main()
{
    int a,b,c,d;
    scanf("%d %d %d %d",&a,&b,&c,&d);
    if ((a+c)%2==1||(c-a)%2==1||(d-b)%2==1||c<0||d<0)
    {
        printf("No");
        return 0;
    }
    printf("%d %d %d",(a+c)/2,(c-a)/2,(d-b)/2);
}
发表于 2018-02-14 21:34:44 回复(0)
设输入数据为a,b,c,d。变量A,B,C
根据题目前三条件可知:A=(a+c)/2;B=A-a;C=B-b;
然后判断第四个条件,B+C是否d,如果为真,则输出A,B,C;否则输出“No”
发表于 2018-01-18 17:22:19 回复(0)
#include <iostream>

using namespace std;

int main()
{     int a,b,c,d;     int A,B,C;     while(cin>>a>>b>>c>>d)     {         A = (a+c)/2;         B = (b+d)/2;         C = (d-b)/2;         if(A-B==a && B-C==b && A+B==c && B+C==d)             cout<<A<<" "<<B<<" "<<C<<endl;         else             cout<<"No"<<endl;     }     return 0;
}

发表于 2018-01-08 01:00:07 回复(0)
python:就是比较简单的和差公式方法,比较需要 注意的是,B的求法要再用一种方法验证,只用三个是不行的,如果ABC满足 条件加入列表时我又加入了空格,方便 直接输出输入用的是map函数,
def Number(n1,n2,n3,n4):
    ls=[]
    A=(n1+n3)/2
    B1=(n3-n1)/2
    B2=(n2+n4)/2
    C=(n4-n2)/2
    if A>=0 and A==int(A):
        ls.append(int(A))
        ls.append(" ")
    if B1>=0 and B1==int(B1) and B1==int(B2):
        ls.append(int(B1))
        ls.append(" ")
    if C>=0 and C==int(C):
        ls.append(int(C))
    if len(ls)==5:
        return ls
    else:
        return "No"
a,b,c,d= map(int,input().split())
b=Number(a,b,c,d)
if b!='No':
    for i  in b:
        print(i,end="")
else:
    print(b)

发表于 2017-10-25 10:01:44 回复(0)
#include<stdio.h>
int main(){
    int i,j,k,flag=0,a,b,c,d,res1,res2,res3;
    scanf("%d%d%d%d",&a,&b,&c,&d);
    for(i=-30;i<=30;i++)
        for(j=-30;j<=30;j++)
            for(k=-30;k<=30;k++)
                if(i-j==a&&j-k==b&&i+j==c&&j+k==d){
                    flag=1;
                    res1=i,res2=j,res3=k;
                }
    flag?printf("%d %d %d\n",res1,res2,res3):printf("No\n");
}

发表于 2017-10-21 16:19:43 回复(0)
这里需要判断有解和无解两种情况,假设有解,则A=(c+a)/2,B=(c-a)/2,C=(c-a-2b)/2;而此时就需要验证四个表达式是否都满足条件同时还要判断2A,2B,2C是否分别等于c+a,c-a,c-a-2b,要排除/运算自动取整的情况
import java.util.Scanner;

public class StringUtil {

	//计算糖果
	public static void main(String[ ] args){
		
		Scanner in = new Scanner(System.in);
		while(in.hasNext()){
			int a = in.nextInt();
			int b = in.nextInt();
			int c = in.nextInt();
			int d = in.nextInt();
			int x = (c+a)/2;
			int y = (c-a)/2;
			int z = (c-a-2*b)/2;
			if(x-y == a && x+y == c && y-z == b && y+z == d && x*2 == a+c && y*2 == c-a && z*2 == c-a-2*b){
				System.out.println(x + " " + y + " " + z);
			}
			else{
				System.out.println("No");
			}
		}
	}
}

发表于 2017-09-04 16:55:56 回复(0)