Tìm chữ số bị khuyết

Mọi người cho em hỏi thuật toán bài này với ạ!!!

Để quản lý tốt các hồ sơ trong kỳ thi tuyển sinh, hội đồng tuyển sinh trường XYZ đã quyết định đánh số các hồ sơ theo một phương pháp khoa học. Mã hồ sơ của thí sinh là một chuỗi gồm 10 chữ số. Tuy nhiên không phải bất kỳ chuỗi 10 chữ số nào cũng là mã hồ sơ hợp lệ bởi vì hội đồng tuyển sinh đưa ra một quy định ràng buộc chặt chẽ cho các chữ số đó. Nếu M=a1a2…a10 là một mã hồ sơ thì M phải thỏa mãn ràng buộc:

Nếu đặt S(M)=1a1+2a2+3a3+…+10a10 thì S(M) phải là một số chia hết cho 11.

Nhờ quy định này, trong những trường hợp do sơ xuất có một chữ số trong mã hồ sơ bị mờ, không đọc được thì ta vẫn có thể xác định được giá trị của nó. Ví dụ như: (quy ước ? là chữ số bị mờ):

  • Với M=00000000?1 thì có thể suy ra chữ số bị mờ là 5 vì theo ràng buộc, để S(M) là một số chia hết cho 11 nó chỉ có thể có giá trị là 55.
  • Tương tự với M=00000001?1 thì có thể suy ra chữ số bị mờ là 9.
  • Tương tự với M=00722?0858 thì có thể suy ra chữ số bị mờ là 6.

Yêu cầu: Hãy viết chương trình giúp hội đồng tuyển sinh suy ra được chữ số bị mờ trong mã hồ sơ.

Dữ liệu: Vào từ file văn bản ENCODE.INP có chứa mã hồ sơ có 1 chữ số bị mờ được thay bằng dấu chấm hỏi.

Kết quả: Ghi ra file văn bản ENCODE.OUT chứa giá trị của chữ số bị mờ trong mã hồ sơ đã cho.

VÍ dụ:

INP
00000000?1

OUT
5

Cái này là đồng dư thức thôi :slight_smile: đọc ra được vị trí bị mờ rồi tra vào một bảng đã nhẩm sẵn :smiley:

3 Likes

Ý tưởng: Tính tổng những số k mờ theo công thức.
Tìm vị trí số bị mờ.
Thử với giá trị nào thì tổng chia hết 11.

Code java
public static void main(String[] agrs) {
    	String n = "00722?0858";
    	int sum = 0;
    	int index = 0;
    	for (int i = 0; i < 10; i++) {
    		 switch (n.charAt(i)) {
    		 case '0' : break;
    		 case '1' : sum += 1 * (i + 1); break;
    		 case '2' : sum += 2 * (i + 1); break;
    		 case '3' : sum += 3 * (i + 1); break;
    		 case '4' : sum += 4 * (i + 1); break;
    		 case '5' : sum += 5 * (i + 1); break;
    		 case '6' : sum += 6 * (i + 1); break;
    		 case '7' : sum += 7 * (i + 1); break;
    		 case '8' : sum += 8 * (i + 1); break;
    		 case '9' : sum += 9 * (i + 1); break;
    		 default: index = i; break;
    		}
    	}
    	for (int i = 0; i<10; i++) {
    		if ((sum + i * (index + 1)) % 11 == 0) {
    			System.out.println(" ? = " + i);
    			break;
    		}
    	}

Bạn hãy phát triển thêm. Ví dụ như kiểm tra tính đúng đắn của số nhập vào. (Có nhiều hơn 1 ký tự ? / mã nhiều/ít hơn10 chữ số chẳng hạn)

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