# GÓC SÁNG TẠO > Khu vực lập trình > Pascal/Delphi/Kylix >  Phép chia (-7 mod 23) trong Pascal và Excel

## thangtnpt0021

Mình sử dụng hàm mod để thực hiện phép chia dư dãy số (có chứa cả số âm) thì được kết quả không đúng.
VD
begin
write(-7 mod 23);
readln;
end.

Nếu kết quả đúng theo như tính bằng Excel, thực tế thì kq phải là 16 nhưng chương trình trên lại in ra : -7.
Xin giúp đỡ.
Thanks!
PS: 
Đây là kq test từ Google: 
http://www.google.com.vn/#hl=vi&sour...190927c2498a1c 
__________________:bawling::bawling::bawling:

----------


## favourhn

> Mình sử dụng hàm mod để thực hiện phép chia dư dãy số (có chứa cả số âm) thì được kết quả không đúng.
> VD
> begin
> write(-7 mod 23);
> readln;
> end.
> 
> Nếu kết quả đúng theo như tính bằng Excel, thực tế thì kq phải là 16 nhưng chương trình trên lại in ra : -7.
> Xin giúp đỡ.
> ...


 Sao lại ra 16 được hả bạn???? -7 chia 23 được 0 dư -7 mà. Ví dụ 39 chia 23 thì mới được 1 dư 16.????? Sao bạn tính bằng exel ra 16 thế???

----------


## 360vietnam

Sreach www.google.com.vn thì nó ra dư 16. Không hỉu nổi!!!

----------


## sevenup024

> Sao lại ra 16 được hả bạn???? -7 chia 23 được 0 dư -7 mà. Ví dụ 39 chia 23 thì mới được 1 dư 16.????? Sao bạn tính bằng exel ra 16 thế???


Mình đã kiểm tra bằng nhiều chương trình (không chỉ có Excel).
Bạn hãy thử vào và điền vào 1 ô: *=MOD(-7,23)*

*Định lý về phép chia với dư*
Giả sử cho hai số nguyên _a_ và _d_, với _d_ ≠ 0
Khi đó tồn tại duy nhất các số nguyên _q_ và _r_ sao cho _a_ = _qd_ + _r_ và 0 ≤ _r_ < | _d_ |, trong đó | _d_ | là giá trị tuyệt đối của _d_.
Các số nguyên trong định lý được gọi như sau

_q_ được gọi là *thương* khi chia _a_ cho _d_. Đôi khi nó còn được gọi là *thương hụt*._r_ được gọi là *dư* khi chia _a_ cho _d__d_ được gọi là *số chia*_a_ được gọi là *số bị chia*Phép toán tìm _q_ và _r_ được gọi là *phép chia với dư*.
*Ví dụ*

Nếu _a_ = 7 và _d_ = 3, khi đó _q_ = 2 và _r_ = 1, vì 7 = (2)(3) + 1.Nếu _a_ = 7 và _d_ = −3, khi đó _q_ = −2 và _r_ = 1, vì 7 = (−2)(−3) + 1.Nếu _a_ = −7 và _d_ = 3, khi đó _q_ = −3 và _r_ = 2, vì −7 = (−3)(3) + 2.Nếu _a_ = −7 và _d_ = −3, khi đó _q_ = 3 và _r_ = 2, vì −7 = (−3)(−3) + 2.Còn hàm trong Excel thì tính như thế này: 
*MOD*(*number*,*divisor*)
*Number* is the number for which you want to find the remainder.
*Divisor* is the number by which you want to divide number.
*Remarks*

 If divisor is 0, MOD returns the #DIV/0! error value. The MOD function can be expressed in terms of the INT function:
MOD(n, d) = n - d*INT(n/d)Trong đó: Hàm INT
*INT*(*number*)
*Number* is the real number you want to round down to an integer.
*Example*
The example may be easier to understand if you copy it to a blank worksheet.

----------


## datxanhmb81

> Mình đã kiểm tra bằng nhiều chương trình (không chỉ có Excel).
> Bạn hãy thử vào và điền vào 1 ô: *=MOD(-7,23)*
> 
> *Định lý về phép chia với dư*
> Giả sử cho hai số nguyên _a_ và _d_, với _d_ ≠ 0
> Khi đó tồn tại duy nhất các số nguyên _q_ và _r_ sao cho _a_ = _qd_ + _r_ và 0 ≤ _r_ < | _d_ |, trong đó | _d_ | là giá trị tuyệt đối của _d_.
> Các số nguyên trong định lý được gọi như sau
> 
> _q_ được gọi là *thương* khi chia _a_ cho _d_. Đôi khi nó còn được gọi là *thương hụt*._r_ được gọi là *dư* khi chia _a_ cho _d__d_ được gọi là *số chia*_a_ được gọi là *số bị chia*Phép toán tìm _q_ và _r_ được gọi là *phép chia với dư*.
> ...


 Mình không hiểu ví dụ này:


```
Nếu a = −7 và d = 23, khi đó q = −3 và r = 2, vì −7 = (−3)(3) + 2.
```


Mình không rành exel lắm, pascal thì đỡ hơn một tí. Trong phép chia dư toán học (mod) nếu một số |a|<|b| thì a mod b=a. Theo mình nghĩ pascal vẫn đúng mà bạn?

----------


## doanhson91

*bổ sung*




> Mình không hiểu ví dụ này:
> 
> 
> ```
> Nếu a = −7 và d = 23, khi đó q = −3 và r = 2, vì −7 = (−3)(3) + 2.
> ```
> 
> Mình không rành exel lắm, pascal thì đỡ hơn một tí. Trong phép chia dư toán học (mod) nếu một số |a|<|b| thì a mod b=a. Theo mình nghĩ pascal vẫn đúng mà bạn?


Hic, thật sự xin lỗi bạn vì chỗ này mình chưa tự tính và sửa (dòng đó không có). Thành thật xin lỗi.

Ví dụ như cách tính của Excel (mình liên hệ sang đây để rõ về cách tính cho kết quả của phép toán MOD):
MOD(n, d) = n - d*INT(n/d)
Trong đó: 

Hàm INT là hàm lấy phần nguyên của giá trị thấp hơn gần nhất.
Cụ thể lấy giá trị như sau: int(8.9)->8 hay int(-8.9)->(-9)
Mình gặp phải một bài Pascal với yêu cầu chia dư và có test dành cho chia dư số âm (VD: -7 mod 23 ->16).

Vậy nên làm thế nào? 
:down:

----------


## buidungbds

CM -7 mod 23 = 16 TROG EXEL : 
Lý thuyết đồng dư ( lớp 6,7 j` đó ):
- a,b chia cho m dư có cùng số dư => a,b đồng dư
- cho trước 1 số nguyên dương m , 2 số nguyên a,b đồng dư theo modulo m khi và chỉ khi a-b chia hết cho m 

Trong vd của bạn :
a= -7 
m = 23
a-b=n ( n là bội của 23 ) => 1 trong các nghiệm của b là 16
Ta có : -7, 16 đồng dư mà 16 mod 23 = 16 => -7 mod 23 = 16

GIẢI THIX :
pascal : Phép mod trong pascal :
+ nếu số chia >= số bị chia : kq đúng về mặt toán học
+ nếu số chia < số bị chia , phép mod lun cho giá trị = số chia
Mình thấy kq trong các code thôi , thầy cô và sách vở k thấy nói đến 

exel tuân theo toán học , mình đã cm cụ thể ở trên 

GIẢI QUYẾT : bạn có thể vik thêm 1 function kt số đồng dư 

p/s : Bạn đừng nên đánh giá đúng , sai giữa 1 ngôn ngữ lập trình bậc cao và 1 phần trong office . Nó đều dựa trên n~ cơ sở đã đc cm . Hiện tại mình chỉ chứng minh đc trong exel , và sẽ cố gắng cm trong pascal . Mình mong bạn hoặc mod sửa lại tiêu đề bài vik

----------


## anthao

Thú vị thật . 
CM -7 mod 23 = -7 TRONG PASCAL


```
-7 | 23 
   |---- 
-7 | 0
```

Tiểu học mình đã đc học cái này nà ( bài phép chia hết và phép chia có dư thì phải , lớp 2,3 j` đó ) : 
số bị chia = số chia * thương + số dư 
=> số dư = ( số bị chia ) - ( số chia * thương ) 
-7 = -7 - ( 23 * 0 ) ( luôn đúng ) 

KẾT LUẬN :
- pascal : dựa vào n~ j` đã học ở tiểu học 
- exel : dựa vào n~ j` đã học ở trung học 

=> cả 2 đều k sai , có cơ sở

----------


## phukotler5

Ẹc, bạn hang_vt được học pascal từ tiểu học cơ à, kinh, mình mới học từ lớp 8 tới giờ. Nhưng theo mình nghĩ, nếu là bài toán Pascal thì cứ theo những hàm của PC mà làm, việc gì mà lại lôi excel ra làm gì, đâu có chắc là chúng có chung cách hoạt động mà lôi chúng ra so sánh.

----------


## morningcity84

> Ẹc, bạn hang_vt được học pascal từ tiểu học cơ à, kinh, mình mới học từ lớp 8 tới giờ. Nhưng theo mình nghĩ, nếu là bài toán Pascal thì cứ theo những hàm của PC mà làm, việc gì mà lại lôi excel ra làm gì, đâu có chắc là chúng có chung cách hoạt động mà lôi chúng ra so sánh.


- hahahah , ý mình nói là . Mình cm -7 mod 23 = -7 trong pascal = kiến thức toán hồi tiểu học . Lớp 9 mình mới học pascal mà 
- pascal , exel có liên wan vs nhau mà

----------


## namnh

> - hahahah , ý mình nói là . Mình cm -7 mod 23 = -7 trong pascal = kiến thức toán hồi tiểu học . Lớp 9 mình mới học pascal mà 
> - pascal , exel có liên wan vs nhau mà


 Oài cứ tưởng bạn học PC từ tiểu học. CÒn 2 soft đó thì có liên quan nhưng bạn giải thích sự liên quan thế nào khi chúng cho ra kq khác nhau đi? liên quan là sự khác nhau à?:a:

----------


## hongson1992

> Oài cứ tưởng bạn học PC từ tiểu học. CÒn 2 soft đó thì có liên quan nhưng bạn giải thích sự liên quan thế nào khi chúng cho ra kq khác nhau đi? liên quan là sự khác nhau à?:a:


bạn có phủ nhận , hầu hết các th , exel cho kq như pascal . Vd n~ bài toán đơn giản khi lập trình ? 
a+b , a-b ???? -> nó k liên wan àhh ?

----------


## shinchao

ok ok có liên quan, nhưng cách thức hoạt động cũng như các hàm và thủ tục của excel không giống hoàn toàn pascal đâu. Vì thế mình toàn dùng PC thôi (vì mít đặc excel mà).

----------

