So sánh chữ số của hai số tự nhiên có 4 chữ số

em có một bài tập đoán số là máy tính chọn ra số ngẫu nhiên có 4 chữ số, các chữ số không lặp lại. Người dùng nhập vào một số có 4 chữ số để đoán, các chữ số không lặp lại nhau. In ra màn hình dạng xAyB nếu Nếu một chữ số của số được đoán ở cùng vị trí và có cùng giá trị với số Ban đầu, hãy đánh dấu 1A.Nếu một chữ số của số đoán sai vị trí nhưng có cùng giá trị với số Ban đầu, hãy đánh dấu 1B.

Em đã giải quyết được việc nhập số và tách số ra để so sánh, nhưng chưa nghĩ ra cách để so sánh. Mọi người có thể gợi ý em phương pháp được không ạ. Em mới học c++ 2 tuần. Em cảm ơn.

#include<iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
int dNum,a1, a2, a3, a4,guess,b1,b2,b3,b4,count=0,count2=0;
srand((unsigned)time(NULL));
do {
	
	dNum = 1000 + rand() % (9000);
	a1 = dNum / 1000;
	a2 = (dNum / 100) % 10;
	a3 = (dNum / 10) % 10;
	a4 = dNum % 10;
} while (a1 == a2 || a1 == a3 || a1 == a4 || a2 == a3 || a2 == a4 || a3 == a4);
cout << dNum << "b\n";
		cout << a1 << "," << a2 << "," << a3 << "," << a4;
		do
		{
			cout << "please enter number";
			cin >> guess;
			b1 = guess / 1000;
			b2 = (guess / 100) % 10;
			b3 = (guess / 10) % 10;
			b4 = guess % 10;
			if (b1 == b2 || b1 == b3 || b1 == b4 || b2 == b3 || b2 == b4 || b3 == b4)
				cout << "try input";
			if (b1 = a1) count = count++;
			if (b2 = a2) count = count++;
			if (b3 = a3) count = count++;
			if (b4 = a4) count = count++;
			cout << count;
			if (count = 4) { cout << "you win"; }
		} while (guess < 1000 || guess>9999 || b1 == b2 || b1 == b3 || b1 == b4 || b2 == b3 || b2 == b4 || b3 == b4);
	return 0;
}

Chuyển đáp án và số nhập vào thành dạng bảng vị trí :slight_smile:

6 Likes
if (b1 = a1)

mấy chỗ này phải xài == nè :V

7 Likes

ban tham khao

void check(int num_gen, int num_check)
{
    int a_cnt = 0, b_cnt = 0;
    char gen[4], check[4];
    for (int i = 0; i < 4; i++) {
        gen[i] = num_gen%10;
        check[i] = num_check%10;
        num_gen /= 10;
        num_check /= 10;
    }

    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            if (gen[i] == check[j]) {
                if (i== j) a_cnt++;
                else b_cnt ++;
                break;
            }
        }
    }

    cout << a_cnt <<"A" << b_cnt << "B" << "\n";
}
5 Likes

Python ko nhanh nhưng gọn :smiling_face_with_three_hearts:

def ab(s1, s2):
    pos_matches = sum(x == y for x, y in zip(s1, s2))
    num_matches = sum(x == y for x, y in itertools.product(s1, s2))
    return pos_matches, num_matches - pos_matches
8 Likes

vâng ạ, bài trên đang là viết nháp

nhìn gọn gàng thật, em cảm ơn

chắc chuyển 1 trong 2 được rồi :V

using PositonTable = std::array<int, 10>;

auto ab(const PositonTable& table, const std::string& inp) {
    int a = 0;
    int ab = 0;
    for (int i = 0; i < 4; ++i) {
        ab += table[inp[i] - '0'] >= 0;
        a += table[inp[i] - '0'] == i;
    }
    return std::make_pair(a, ab - a);
}
5 Likes

cho em hỏi vậy làm sao để giải quyết nếu người dùng nhập vào có dấu cách ạ

đọc cả dòng luôn, xài

#include <iostream>
#include <string>

std::string line;
std::getline(std::cin, line);

rồi xét line này có length = 4 và tất cả là digit 0-9 và các digit khác nhau thì input hợp lệ, còn lại báo lỗi và nhập lại :V

#include <algorithm>
#include <cctype>
#include <set>

bool validInput =
    // chuỗi có đúng 4 ký tự
    line.size() == 4 &&
    // chuỗi chỉ chứa toàn ký tự chữ số
    std::all_of(begin(line), end(line), [](unsigned char c) { return std::isdigit(c); }) &&
    // 4 chữ số khác nhau đôi một, chỗ này hơi hack viết 1 dòng nhờ xài set
    std::set<char>(begin(line), end(line)).size() == 4;

có chuỗi line rồi xài thẳng nó luôn khỏi cần convert sang int lại làm gì :V

5 Likes

em cảm ơn ạ, hơi quá với em, để em hấp thu đã

em viết lại xài mấy vòng for là được mà :V Em viết cái hàm ktra valid input cho line nhập vào là được. Valid input là chuỗi chỉ có 4 chữ số và 4 chữ số này khác nhau đôi một.

4 Likes

khó hiểu thật, code này của em trước còn chạy bình thường giờ cin vào nhấn enter thì nó xuống dòng, em mò mãi mà ko hiểu tại sao

#include<iostream>
#include <cstdlib>
#include <ctime>
#include<limits>//used to get numeric limits

using namespace std;

int check_guess()//function to check the input number is correct
{
	int   A, A1, A2, A3, A4;
	do
	{
		cout << "Please input 4 digit number: ";
		cin >> A;
		if ((!cin >> A)) {  //if the input data is not a number 
			cin.clear();//clears error flags
			cin.ignore(numeric_limits<streamsize>::max(),'\n');//discard input
		}
		A1 = A / 1000;     //Use % and / split an int into its digits
		A2 = (A / 100) % 10;
		A3 = (A / 10) % 10;
		A4 = A % 10;
		if (A < 1000 || A>9999 || A1 == A2 || A1 == A3 || A1 == A4 || A2 == A3 || A2 == A4 || A3 == A4 || A1 == 0 || A2 == 0 || A3 == 0 || A4 == 0 || !(cin >> A))
			cout << "Error! different please!\n";
	} while (A < 1000 || A>9999 || A1 == A2 || A1 == A3 || A1 == A4 || A2 == A3 || A2 == A4 || A3 == A4 || !(cin >> A));     //foolproof if the input number is not correct
	return A;
}

void check(int num_rand, int num_check)     //The function compares the guess and the number the program generates
{
	int a_cnt = 0, b_cnt = 0;
	char gen[4], check[4];       //declare array
	for (int i = 0; i < 4; i++) {
		gen[i] = num_rand % 10;      //assigns the values ??of two numbers to the array
		check[i] = num_check % 10;
		num_rand /= 10;
		num_check /= 10;
	}

	for (int i = 0; i < 4; i++) {   //The loop compares the value of each digit
		for (int j = 0; j < 4; j++) {
			if (gen[i] == check[j]) {
				if (i == j) a_cnt++;
				else b_cnt++;
				break;

			}
		}
	}

	cout << a_cnt << "A" << b_cnt << "B" << "\n";

}

int main()
{
	int dNum, a1, a2, a3, a4, guess;
	srand((int)time(NULL));

	do {
		dNum = 1000 + rand() % (9000);//randomly generate a 4 - digit number
		a1 = dNum / 1000;
		a2 = (dNum / 100) % 10;
		a3 = (dNum / 10) % 10;
		a4 = dNum % 10;
	} while (a1 == a2 || a1 == a3 || a1 == a4 || a2 == a3 || a2 == a4 || a3 == a4 || a1 == 0 || a2 == 0 || a3 == 0 || a4 == 0);


	do {
		guess = check_guess();//ask the player until they guess the correct number
		check(guess, dNum);
	} while (guess != dNum);
	if (guess == dNum) cout << "YOU WIN\a";

	return 0;
}

Nhập string mới cần clear trước, nhập số thì không cần vì nó tự nhảy rồi.

Bài này đổi qua nhập string cho rồi :smiley:

4 Likes

em xóa clear rồi mà enter no vẫn xuống dòng

em đang định đổi qua dùng string, nhưng cái code cũ hôm bữa còn chạy được giờ nhập số nhấn enter nó cứ xuống dòng ko hiểu nổi

sai dòng này đây. Dấu ! ở ngoài () chứ: if (!(cin >> a))

3 Likes

em cũng đã sửa và vẫn lỗi

sửa thế nào :V
20 char

1 Like

em đưa dấu ! ra ngoài

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