Bài toán chó gà

Việc chặn khoảng 2 nghiệm rồi dùng vòng for x, y (2 nghiệm) trong 2 khoảng đó để mò được nghiệm rất dễ làm, đúng không?

1 Like

e làm dc rồi bác nhưng thắc mắc là in ra cái invailid như thến nào hix
code em
{
int socon,sochan;
cin>>socon>>sochan;
for(int ga=1; ga<socon&&2ga<sochan; ga++)
{
for(int cho=1; cho<socon&4
cho<sochan; cho++)
{
if(2ga+cho4==sochan&&ga+cho==socon)
{

            cout<<"chicken ="<<ga<<" "<<"dog ="<<cho;
        }
    }
}

}

Một cách giải thường quy cho bài toán này: Thuật toán vét cạn :smiley:

Xem lại chỗ này.

Nếu có kết quả thì bạn thêm return 0 ngay sau dòng cout. Cuối chương trình thêm cout << "Invalid".

2 Likes

c# nhưng em nghĩ thế này chạy hơi chậm các bác nhỉ

class Program
    {
        static void Main(string[] args)
        {
            int i = 1;// so con ga
            int j = 0;// so con cho 
            for(i=1;i<36;i++)
            {
                j = 36 - i;
                int k = 2 * i + 4 * j;
                if (k == 100)
                    break;
            }
            Console.WriteLine("so con ga la :"+i);
            Console.WriteLine("so con cho la:"+j);
            Console.ReadKey();
        }
    }
#include <iostream>
using namespace std;

bool checkvalid(int sum, int footsum);
int main()
{
    int sum = 0;
    int footsum = 0;
    cout << "Enter sum: " << '\n';
    cin>>sum;
    cout<< "Enter footsum: " << '\n';
    cin>>footsum;
    checkvalid(sum,footsum);
    return (0);
}

bool checkvalid(int sum, int footsum)
{
    int g = 0;
    int c = 0;
    int temp = (4 * sum - footsum);
    if (temp < 0 || temp % 2 != 0)
    {
        cout << "Invalid";
        return 0;
    }
    g = temp / 2;
    cout << "Dog: " << sum - g << '\n';
    cout << "Chicken: " << g << '\n';
    return 1;
}

Càch mà newb hay làm thì đúng hơn.

1 Like

x = gà
y = chó
x + y = 36 -> (x+y)*2 = 72. Cái phương trình nhân 2 số gà và chó này có thể dịch ra là: Giả sử tất cả số con là gà, có 72 chân tất cả. Hoặc nếu cho phương trình này là (x+y)*4 = 144 -> Giả sử tất cả là chó -> có 144 chân tất cả
x*2 + y*4 = 100 -> (x+y)*2 + 2y = 100 => 2y = 100-72 => y= 28/2 = 14 con chó, từ đây tìm được số gà
hoặc (x+y)*4 - 2x = 100
=> 2x = 144 - 100 => x= 44/2 = 22 con gà. Từ đây tìm được số chó.


Vậy chương trình sẽ có pseudocode là:

  • input tổng số chó và gà. Ở bài toán trên tổng số chó và gà là 36.
    Đặt z = 36 và
    Ta đặt biến z1 = 36*2. (giả sử tất cả là gà và như vậy ta sẽ có số chân gà)
  • input tổng số lượng chân chó và chân gà. Ở bài toán trên là 100
    Ta đặt biến z2 = 100.

-> Nếu:

  • z1 > z2. => invalid (Tất cả chân gà không thể lớn hơn được số chân của 2 con
  • z1 = z2 => x = số gà = z1 (hoặc z2, như nhau) / 2. y = số chó
  • z1 < z2. Giải tiếp:
    • Nếu z2 - z1 mod 2 !=0: báo invalid
    • Nếu z2 - z1 mod 2: xong rồi, lấy z2 -z1 / 2 = y (số chó)
      x = z - y

Bài toán chó gà này cũng giống bài toán trâu đứng, trâu nằm, trâu già.

Tất nhiên là giải bài toán trên với máy tính sẽ khác với cách chúng ta giải phương trình học ở trường, cũng khác với cách giải của học sinh cấp 1 khi chưa biết đặt phương trình

Nếu không giải bằng vòng lặp, lúc này đề bài sẽ phải là “hãy viết chương trình giải phương trình cho trước với các số được nhập vào từ bàn phím”.

Do vậy, theo mình nghĩ ở đây không bàn đến việc giải phương trình mà chỉ là dùng vòng lặp để giải quyết vấn đề.

2 Likes

Cậu sai ở 2 test case bị đánh dấu chéo ấy @@


Tớ tò mò chút, cậu kỳ vọng nhận được câu trả lời gì khi chụp lại phần quan trọng nhất của code của cậu, là mấy dòng đóng ngoặc nhọn, và hỏi cậu sai ở đâu? :slight_smile:

1 Like

nma còn ngược lại in ra valied thì làm the nào bạn

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?