Trang chủ Tin Học Lớp 9 Tìm số đối xứng thứ n Vd Input 30 Output...

Tìm số đối xứng thứ n Vd Input 30 Output 212 Giới hạn n<10^6 Các bạn cho mình ý tưởng code bài này có thời gian chạy < 1s - câu hỏi 4652100

Câu hỏi :

Tìm số đối xứng thứ n Vd Input 30 Output 212 Giới hạn n<10^6 Các bạn cho mình ý tưởng code bài này có thời gian chạy < 1s

Lời giải 1 :

Ý tưởng:

- Tạo một mảng sdx lưu các số đối xứng.

- Đầu tiên, lưu các số từ 1->9.

- Sau đó, cứ mỗi số thứ i ta sẽ lưu các số đối xứng i+reverse(i), i+k+reverse(i) (0<=k<=9). Vd: Số 12 ta có thể lưu các số đối xứng sau: 1221, 12021, 12121, 12221, 12321, ... , 12921. Để các số đối xứng được theo thứ tự, ta sẽ lưu các số i+reverse(i) trước rồi mới lưu các số i+k+reverse(i).

- Cuối cùng là nhập và xuất ra số đối xứng thứ n (phần tử thứ n-1).

Code:

#include <bits/stdc++.h>
using namespace std;
vector<string> sdx;
string rvs(string s){
    string s2 = "";
    for (long long i=s.size()-1; i>=0; i--){
        s2+=s[i];
    }
    return s2;
}
void ts(){
    for (long long i=1; i<=9; i++){
        sdx.push_back(to_string(i));
    }
    for (long long i=0; i<=4; i++){
        long long s = pow(10,i);
        long long e = pow(10,i+1); //s*10
        for (long long j=s; j<e; j++){
            string t = to_string(j);
            sdx.push_back(t+rvs(t));
        }
        for (long long j=s; j<e; j++){
            for (long long k=0; k<=9; k++){
                string t = to_string(j);
                sdx.push_back(t+to_string(k)+rvs(t));
            }
        }
    }
}
int main(){
    ts();
    long long n;
    cin >> n;
    cout << sdx[n-1];
}

$\color{red}{\text{#Daoanhviet96}}$

image

Thảo luận

-- căng vậy :)
-- Còn code của ông thì không chạy nổi 10^6 trong 1s đâu :v
-- uk căng lắm đến ${10^5}$
-- Cơ mà code ông nó là if else đến chết nhỉ :))
-- trong hàm rvs thay thành: reverse(s.begin(), s.end()); return s; cho nhanh này :))

Lời giải 2 :

#toidicodedao

Ý tưởng:

- Số đối cứng có tính chất: một số a, ta đảo ngược a rồi ghép vào sau (đối với số có chữ số chẵn), đảo ngược a div 10 rồi ghép vào sau (đối với số có chữ số lẻ). Khá khó giải thích, nên mình lấy ví dụ: Đoạn các số có 2 và 3 chữ số (cặp chẵn, lẻ) có 10^2*2 số đối xứng, loại các tường hợp số 0 đứng đầu, ta còn (10^2-10)*2 trường hợp. Ta đếm rồi xác định xem số cần tìm nằm trong khoảng nào, sau đó xây dựng lại số này. Vd: 30 nằm trong khoảng 3 chữ số, cách số có 3 chữ số đầu tiên là 11 đơn vị. Số đầu tiên là 101 tức là 10, ta cộng cho 11 được 21, làm theo tính chất thu được 212. Một vài trường hợp đặc biệt khác ràng thêm trong chương trình.

#include <bits/stdc++.h>
using namespace std;

int n,i; long long k,kq; bool odd;

int main () { 
   cin>>n;
   if (n==9) return cout<<9, 0;
   k=1; odd=1;
   for (i=0; i+(k*10-k)<=n; ){
    odd=(!odd);
    i+=k*10-k;  
    if (odd==1) k*=10;
 }
 k+=n-i-1;
 kq=k;
 while (k!=0){
  if (!(odd && k==kq && n!=i))
   kq=kq*10+(k%10);
  k/=10;
 }
 cout<<kq;
}

Bạn có biết?

Tin học, tiếng Anh: informatics, tiếng Pháp: informatique, là một ngành khoa học chuyên nghiên cứu quá trình tự động hóa việc tổ chức, lưu trữ, xử lý và truyền dẫn thông tin của một hệ thống máy tính cụ thể hoặc trừu tượng (ảo). Với cách hiểu hiện nay, tin học bao hàm tất cả các nghiên cứu và kỹ thuật có liên quan đến việc mô phỏng, biến đổi và tái tạo thông tin.

Nguồn : Wikipedia - Bách khoa toàn thư

Tâm sự 9

Lớp 9 - Là năm cuối ở cấp trung học cơ sở, sắp phải bước vào một kì thi căng thẳng và sắp chia tay bạn bè, thầy cô và cả kì vọng của phụ huynh ngày càng lớn mang tên "Lên cấp 3". Thật là áp lực nhưng các em hãy cứ tự tin vào bản thân là sẻ vượt qua nhé!

Nguồn : ADMIN :))

Copyright © 2021 HOCTAP247