Code tìm các số có 3 chữ số mà tổng và tích các chữ số bằng nhau chạy chậm và chỉ in ra số 0

c

(Khải Nguyễn) #1

Đề bài: Tìm các số có 3 chữ số mà tổng và tích các chữ số bằng nhau, vd: 123 (123=1+2+3)

Code của e chạy chậm và ra mỗi số 0 :smiley: các bác xem giúp e vs ạ :slight_smile:

int main(){ 
int tong=0,tich=1,du,du1; 
for(int i=100;i<1000;i++){ 
 int 
while(i){
du=i%10; 
i/=10; 
tong+=du;
} 
while(i){
du1=i%10; 
i/=10;
tich*=du1; 
} 
if(tong==tich) printf("So do la %d: ",i); 
}


(Cat Lord) #2

Bạn in i, nhưng i bạn chia / cho 10 thì chưa đúng rồi :smiley:
Đơn giản là cho 1 biến lưu trữ giá trị ban đầu nữa là được


(Quân) #3

Bạn có 1 số lỗi mắc phải.

  1. Bạn thay đổi i trong vòng for
  2. Không reset biến tong và tich giữa các vòng for
  3. Dùng chung i cho cả tính tổng và tích các chữ số nhưng lại làm thay đổi giá trị của i nên số i tại thời điểm bắt đầu tính tổng và tích các chữ số không giống nhau

(Hung) #4

Các số thoả mãn chỉ có 123 và các hoán vị của nó (132, 213, 231, 312, 321), nên cho 6 câu lệnh printf() cho 6 hoán vị là xong.

Chứng minh:
Gọi số thoả mãn đề bài có dạng là abc (a > 0), với a,b,c là các số nguyên không âm. Theo đề bài:

  • a + b + c = abc (1)

Nếu 1 trong 2 số b và c bằng 0, không mất tính tổng quát, giả sử b = 0. Điều kiện (1) trở thành: a + c = 0, mà a > 0 nên c < 0, trái điều kiện c là số nguyên không âm.
Do đó a,b,c đều là các số nguyên dương, a > 0, b > 0, c > 0 (2)

Với điều kiện (2) thì vai trò a,b,c là như nhau, với 1 cặp thoả mãn thì các hoán vị của nó cũng thoả mãn. Vì vậy, không mất tính tổng quát, giả sử 0 < a ≤ b ≤ c (3)

Biến đổi từ (1): a(bc - 1) = b + c (4)

Trường hợp 1: a = 1. Khi đó (4) trở thành:

  • bc - 1 = b + c
  • bc - b - c + 1 = 2
  • (b - 1)(c-1) = 2 (5)

(5) có 1 nghiệm duy nhất b - 1 = 1, c - 1 = 2, hay b = 2, c = 3. Một nghiệm thoả mãn (a,b,c) = (1,2,3)

Trường hợp 2: a > 1. Khi đó (4) được biến đổi: (bc - 1 > 0 với mọi c ≥ b ≥ a > 1)

Đặt g(b,c) là hàm 2 biến, với b ∈ [2, 9], c ∈ [2, 9]:

Đạo hàm riêng biến b:
(6)

Đạo hàm riêng biến c:
(7)

Vì hai đạo hàm (6) và (7) đều nhỏ hơn 0, nên g(b,c) nghịch biến trên cả 2 biến b và c.
Suy ra a = g(b,c) ≤ g(2,2) = 4/3 < 2, trái giả thuyết a > 1

Vậy không có cặp (a,b,c) thoả mãn với điều kiện a > 1.


(henry) #5

O(1) is not fair :relieved: we should follow programming ways.


(Khải Nguyễn) #6


E tìm được cách làm r, cảm ơn các bác


(rogp10) #7

(st :smiley: )

ngắn gọn, phương trình đối xứng

Nếu 1 trong 3 số bằng 0 thì hai số kia cũng phải bằng 0 (loại). Vậy pt thật sự là đối xứng.
Kmttq giả sử 1<=a<=b<=c
vậy a+b+c <= 3c
<=> abc <= 3c do (*)
<=> (ab - 3)c <= 0
<=> ab <= 3
ab = 1: a = b = 1, (*) trở thành 2 + c = c vô nghiệm
ab = 2: a = 1 && b = 2, (*) trở thành 3 + c = 2c <=> c = 3
ab = 3: a = 1 && b = 3, (*) trở thành 4 + c = 3c <=> c = 2 loại
vậy pt chỉ có nghiệm (1, 2, 3) và các hoán vị
6 số là 123 132 213 231 312 321


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