Trang 1/2 12 cuối
kết quả từ 1 tới 12 trên 15

bàI TẬP XỬ LÝ SỐ NGUYÊN LỚN MỌI NGƯỜI GIÚP VỚI

  1. #1
    Ðến Từ
    Quảng Bình
    Thành Viên Thứ: 353068
    Giới tính: Nam
    Bài gửi
    22

    bàI TẬP XỬ LÝ SỐ NGUYÊN LỚN MỌI NGƯỜI GIÚP VỚI

    Cho số X gồm N chữ số, Số Y gồm M chữ số (1<=M<=32000; 1<=N<=32000)).
    Yêu cầu: Tính hiệu 2 số X và Y.
    Dữ liệu vào: Cho trong file văn bản HIEU.INP có cấu trúc như sau:
    Dòng 1: Ghi 2 số nguyên dương N M mỗi số cách nhau một dấu cách.
    Dòng 2: Ghi số X
    Dòng 3: Ghi số Y
    Dữ liệu ra: Ghi ra file HIEU.OUT, theo cấu trúc như sau:
    Dũng 1: Ghi giá trị hiệu.
    Ví dụ:
    HIEU.INP HIEU.OUT
    3 4
    333
    5436
    -5103

    giúp mình làm bằng mảng 1 chiều với ak
    Quick reply to this message Trả lời       


  2. #2
    Ðến Từ
    TP. Hồ Chí Minh
    Thành Viên Thứ: 261001
    Giới tính: Nam
    Bài gửi
    1.008

    Reply: bàI TẬP XỬ LÝ SỐ NGUYÊN LỚN MỌI NGƯỜI GIÚP VỚI

    dùng ansistring nhé

  3. #3
    Ðến Từ
    TP. Hồ Chí Minh
    Thành Viên Thứ: 56897
    Giới tính: Nam
    Bài gửi
    881

    Reply: bàI TẬP XỬ LÝ SỐ NGUYÊN LỚN MỌI NGƯỜI GIÚP VỚI

    Bạn có thể tham khảo post #29 trong bài viết này của mình:
    Mã:
    http://vforum.vn/diendan/showthread.php?93595-Giai-thich-giup-minh-thuat-toan-cua-bai-nay-cho-minh-voi-kho-qua-/page3
    LCD: 13.3" 1920x1080 IPS
    CPU: Intel i7 - 4700MQ (2.4 GHz - 3.4 GHz)
    GPU: Nvidia GTX 765m with GDDR5 2GB
    RAM: 2x8GB G.Skill 2133
    HDD: Samsung SSD 850 Pro 512 GB
    2 kg.

  4. #4
    Ðến Từ
    Quảng Bình
    Thành Viên Thứ: 353068
    Giới tính: Nam
    Bài gửi
    22

    Reply: bàI TẬP XỬ LÝ SỐ NGUYÊN LỚN MỌI NGƯỜI GIÚP VỚI

    cho mình hỏi chút, khi mình viết được hàm so sánh hai mảng rồi mình sẽ gọi hàm này tại thủ tục trừ pải không bạn!
    khi đó
    trong procedure trừ
    sẽ là
    t := compare(a, na, b, nb);
    if t =1 then
    lấy a[i] - b[i]
    else
    if t=-1 then
    lấy b[i] - a[i] phải thế khổng hả bạn
    cho mình hỏi thêm với bài này thi hàm compare chỉ cầnn trả về hai kết quả thôi pai ko bạn


  5. #5
    Ðến Từ
    TP. Hồ Chí Minh
    Thành Viên Thứ: 56897
    Giới tính: Nam
    Bài gửi
    881

    Reply: bàI TẬP XỬ LÝ SỐ NGUYÊN LỚN MỌI NGƯỜI GIÚP VỚI

    Trích Nguyên văn bởi tuongsonqt Xem bài viết
    cho mình hỏi chút, khi mình viết được hàm so sánh hai mảng rồi mình sẽ gọi hàm này tại thủ tục trừ pải không bạn!
    khi đó
    trong procedure trừ
    sẽ là
    t := compare(a, na, b, nb);
    if t =1 then
    lấy a[i] - b[i]
    else
    if t=-1 then
    lấy b[i] - a[i] phải thế khổng hả bạn
    cho mình hỏi thêm với bài này thi hàm compare chỉ cầnn trả về hai kết quả thôi pai ko bạn
    Bạn nên làm nó bên ngoài procedure differences nhé. Ví dụ như:
    Mã:
    t := compare(a, na, b, nb);
    if (t > 0) then
       begin
          differences(a, na, b, nb);
          in ra kết quả chứa trong a.
       end
    else if (t < 0) then
       begin
          differences(b, nb, a, na);
          in ra kết quả chứa trong b.
       end
    else
       in ra số 0.
    PS: Mình chưa xử lý số âm nhé.

  6. #6
    Ðến Từ
    Quảng Bình
    Thành Viên Thứ: 353068
    Giới tính: Nam
    Bài gửi
    22

    Reply: bàI TẬP XỬ LÝ SỐ NGUYÊN LỚN MỌI NGƯỜI GIÚP VỚI

    Bạn ơi bạn sosanh t>0 với t< 0 co nghĩa la hàm sosanh trả về hai kqua la 1 và -1 phải ko bạn

  7. #7
    Ðến Từ
    TP. Hồ Chí Minh
    Thành Viên Thứ: 56897
    Giới tính: Nam
    Bài gửi
    881

    Reply: bàI TẬP XỬ LÝ SỐ NGUYÊN LỚN MỌI NGƯỜI GIÚP VỚI

    Trích Nguyên văn bởi tuongsonqt Xem bài viết
    Bạn ơi bạn sosanh t>0 với t< 0 co nghĩa la hàm sosanh trả về hai kqua la 1 và -1 phải ko bạn
    Đúng rồi đó bạn; mình ghi thế cho ngắn gọn. Tương tự như a - b > 0, a - b < 0, hay a - b = 0 vậy.

    PS: Mình quên mất 1 vấn đề quan trọng, khi t < 0 (tức là a < b) thì kết quả phải là số âm. Khi đó bạn cần 1 dòng lệnh nữa nhé.
    Mã:
    b[nb] = -b[nb];

  8. #8
    Ðến Từ
    Quảng Bình
    Thành Viên Thứ: 353068
    Giới tính: Nam
    Bài gửi
    22

    Reply: bàI TẬP XỬ LÝ SỐ NGUYÊN LỚN MỌI NGƯỜI GIÚP VỚI

    Mảng a la mang chứa kết quả của phép trừ a - b còn mảng b là phep trừ của b - a .còn khi phep sosanh= 0 ta ko can tính và in ra ngay la số 0 ý tương nôm na có pải vậy ko bạn

  9. #9
    Ðến Từ
    Quảng Bình
    Thành Viên Thứ: 353068
    Giới tính: Nam
    Bài gửi
    22

    Reply: bàI TẬP XỬ LÝ SỐ NGUYÊN LỚN MỌI NGƯỜI GIÚP VỚI

    Nình mới đọc lai bài bạn viết.dong lệnh mà bạn nói se nằm khi minh in mảng b ra hả bạn

  10. #10
    Ðến Từ
    TP. Hồ Chí Minh
    Thành Viên Thứ: 56897
    Giới tính: Nam
    Bài gửi
    881

    Reply: bàI TẬP XỬ LÝ SỐ NGUYÊN LỚN MỌI NGƯỜI GIÚP VỚI

    Trích Nguyên văn bởi tuongsonqt Xem bài viết
    Mảng a la mang chứa kết quả của phép trừ a - b còn mảng b là phep trừ của b - a .còn khi phep sosanh= 0 ta ko can tính và in ra ngay la số 0 ý tương nôm na có pải vậy ko bạn
    Đúng rồi đó bạn.
    Trích Nguyên văn bởi tuongsonqt Xem bài viết
    Nình mới đọc lai bài bạn viết.dong lệnh mà bạn nói se nằm khi minh in mảng b ra hả bạn
    Để mình đẩy bạn vào trọng tâm của bài này nhé. Bạn đọc kỹ lại thì sẽ thấy bài này không đơn giản thế. 2 số X và Y có thể âm, cũng có thể dương, bởi vậy tuy là tính hiệu nhưng mà cũng có thể tính tổng. Phần code ở bài khác chỉ để bạn tham khảo phương pháp làm. Bài này có nhiều trường hợp như là:
    Mã:
    Cùng dấu:
    - 0 <= X <= Y.
    - 0 <= Y <= X.
    - X <= Y <= 0.
    - Y <= X <= 0.
    Khác dấu:
    - X <= 0 <= Y.
    - Y <= 0 <= X.
    Bạn cần nghĩ thật kỹ xem: làm sao biểu diễn số âm, với mỗi trường hợp như trên thì kết quả tính thế nào, làm sao viết procedure tính tổng 2 số,... Ví dụ, thay vì mảng a và b từ 1..32001, thì chúng ta tăng thêm 0..32001 (hoặc là 1..32002) để lưu dấu cho 2 số X và Y. Với cách biểu diễn này thì chúng ta chỉ cần biết khi nào tính tổng, khi nào tính hiệu, số nào lớn hơn, và lấy số nào trừ cho số nào, để sau đó kết quả cuối cùng chúng ta biết chắc chắn đó phải là âm hay dương để lúc in ra thì có thêm dấu - hay không.

  11. #11
    Ðến Từ
    Quảng Bình
    Thành Viên Thứ: 353068
    Giới tính: Nam
    Bài gửi
    22

    Reply: bàI TẬP XỬ LÝ SỐ NGUYÊN LỚN MỌI NGƯỜI GIÚP VỚI

    với trường hợp bạn nói xử lý số âm phải xử lý bằng bit hả bạn...thật thì mình cũng chưa nghĩ ra cáchđể lưu số âm thế nào
    nếu nhiều trường hợp như thế mình phải có thêm thủ tục cộng nữa hả bạn

  12. #12
    Ðến Từ
    TP. Hồ Chí Minh
    Thành Viên Thứ: 56897
    Giới tính: Nam
    Bài gửi
    881

    Reply: bàI TẬP XỬ LÝ SỐ NGUYÊN LỚN MỌI NGƯỜI GIÚP VỚI

    Trích Nguyên văn bởi tuongsonqt Xem bài viết
    với trường hợp bạn nói xử lý số âm phải xử lý bằng bit hả bạn...thật thì mình cũng chưa nghĩ ra cáchđể lưu số âm thế nào
    nếu nhiều trường hợp như thế mình phải có thêm thủ tục cộng nữa hả bạn
    Trên OS và nhiều compilers thì dùng bit để đánh dấu, nhưng chúng ta có thể đặt hẳn 1 biến shortint để làm việc này. Nếu bạn nhìn vào mấy trường hợp thì thấy: cùng dấu là phải trừ, khác dấu thì cộng. Như vậy, ví dụ nhé, nếu mình khai báo
    Mã:
    type numArr = array[0..32001] of shortint
    với X[0] = 1 nếu X > 0 và -1 nếu X < 0, thì còn lại, |X| = 1..32001. Khi đó,
    Mã:
    Cùng dấu:
    - 0 <= X <= Y. Kết quả X - Y = -(|Y| - |X|).
    - 0 <= Y <= X. Kết quả X - Y = |X| - |Y|.
    - X <= Y <= 0. Kết quả X - Y = -(|X| - |Y|).
    - Y <= X <= 0. Kết quả X - Y = |Y| - |X|.
    Khác dấu:
    - X <= 0 <= Y. Kết quả X - Y = -(|X| + |Y|).
    - Y <= 0 <= X. Kết quả X - Y = |X| + |Y|.
    Tư tưởng của thủ tục cộng giống như của trừ, có thể dễ hơn trừ nữa bạn ạ. Bạn đã viết trừ rồi thì thấy nó y chang như trừ tay; bây giờ bạn thử viết cộng xem.

    PS: Trước hết bạn làm phần cùng dấu trước đã, sau hãy làm phần khác dấu. Function compare là so sánh |X| và |Y| đấy. Code xử lý chung chung sẽ như thế này.
    Mã:
    if (a[0] > 0 and b[0] > 0) then   // X và Y cùng dương.
       begin
          t := compare(a, na, b, nb);
          if (t > 0) then   // |X| > |Y|
             begin
             end
          else if (t < 0) then   // |X| < |Y|
             begin
             end
          else ...
       end
    else if (a[0] < 0 and b[0] < 0) then   // X và Y cùng âm.
       begin
          // xử lý tương tự
       end
    else if (a[0] < 0 and 0 < b[0]) then   // X âm và Y dương.
       begin
          sum(a, na, b, nb); // cộng lại, kết quả lưu ở a.
          in kết quả -a.
       end
    else   // trường hợp cuối X dương và Y âm.
       begin
          sum(a, na, b, nb); // cộng lại, kết quả lưu ở a.
          in kết quả a.
       end;
    Những trường hợp đặc biệt như 0 hay input có mấy số 0 ở đầu thì bạn tự xử lý nhé.

    Bài không khó lắm đâu bạn. Bài này theo khuynh hướng kỹ thuật lập trình. Bạn cố gắng làm nhé!

    Good luck.

  13. Đã cảm ơn tengiday:


Trang 1/2 12 cuối