Hỏi bài: Chia bánh sinh nhật

Em mới học C++ được vài tháng. Có vài bài mong được mọi người chỉ giúp.

1) Mẹ của Hồng và Hà dự định tổ chức sinh nhật cho hai chị em sinh đôi này bằng cách làm hai chiếc bánh sinh nhật hình tròn giống nhau. Tuy nhiên, nhà chỉ có mỗi một cái bàn hình tam giác. Em hãy lập trình giúp bà ấy tìm bán kính lớn nhất của mỗi chiếc bánh sao cho hai chiếc bánh đều nằm hoàn toàn trên mặt bàn và không được chồng lên nhau.

Dữ liệu vào từ bàn phím 3 số nguyên dương a, b, c là 3 cạnh của cái bàn hình tam giác bất kì với:
0 < a, b, c < 10^9
a < b + c
b < a + c
c < a + b

Kết quả in ra màn hình 1 số thực là bán kính lớn nhất của chiếc bánh sinh nhật. Kết quả được làm tròn 3 chữ số thập phân.

Ví dụ:
Nhập vào: a = 5, b = 12, c = 13
In ra: 1.529
yf0HX.png

url
Hình ảnh chỉ mang tính chất minh họa, kết quả có thể không phải lớn nhất.

Ai giúp em với. Em cám ơn nhiều. :facebook8:
 

Em yêu Vforum

Cần tìm anh trai nuôi :)
2 hình tròn bằng nhau, cùng bán kính R như hình: 2 hình tròn nằm dọc theo cạnh dài nhất của tam giác.
Dùng cách dựng hình và hình học phẳng, lượng giác, tìm ra công thức tính R từ a,b,c.
Đưa công thức đã tìm ở trên vào phần lập trình, in ra kết quả
Hết
 
Em cũng biết đại khái thế, nhưng quan trọng là làm thế nào? Công thức đâu? Làm sao bạn biết phải nằm dọc theo cạnh dài nhất?
 

aloxinh_nb

It's Secret !
Em cũng biết đại khái thế, nhưng quan trọng là làm thế nào? Công thức đâu? Làm sao bạn biết phải nằm dọc theo cạnh dài nhất?

Thế cái ví dụ kia làm sao tính ra thế @@. Hay đề nó ghi v :dmh:
 

tengiday

Happy life
Bài này có nhiều cách làm. Bạn thử cái này xem nhé.

Nhận xét:
[ah]
Để 2 đường tròn thỏa mãn tính chất bài toán thì:
a) 2 đường tròn phải tiếp xúc nhau và tiếp xúc với các cạnh của tam giác.
b) Sẽ có 1 cạnh của tam giác phải tiếp xúc với cả 2 đường tròn. 2 cạnh còn lại chỉ tiếp xúc với 1 đường tròn.
c) Tâm của mỗi đường tròn phải nằm trên đường thẳng nối giữa tâm của đường tròn nội tiếp và 1 trong 3 đỉnh của tam giác.
[/ah]
Không mất tính tổng quát, giả sử 2 đường tròn cần tìm tiếp xúc với cạnh a của tam giác ABC như trong hình vẽ.
49hNPC.png

Gọi:
- r là bán kinh của bánh sinh nhật lớn nhất cần tìm (đường tròn nhỏ).
- R là bán kính của đường tròn nội tiếp tam giác ABC.
- p là nửa chu vi của tam giác ABC, tức là p = (a + b + c) / 2.
Mã:
[CENTER]1/R = sqrt( p / ((p-a)(p-b)(p-c)) ).[/CENTER]
Tại sao?
[ah]
Nếu A là diện tích của tam giác thì
- Ta dễ dàng thấy: A = p*R.
- Công thức Heron về diện tích tam giác: A = sqrt( p(p-a)(p-b)(p-c) ).
[/ah]

Gọi u, v, x, y là độ dài các cạnh theo như hình vẽ. Theo hệ quả của định lý Thales, ta có:
Mã:
u/x = r/R và v/y = r/R.

Mã:
a = u + 2r + v = (x/R)*r + 2r + (y/R)*r = (2 + a/R) * r,
ta có công thức tìm r như sau:
Mã:
[CENTER]r = a/(2 + a/R),[/CENTER]
với 1/R được tính như trên. Đây chính là công thức cần tìm.

Điểm cuối cùng: a phải là cạnh nào?
Trả lời: a phải là cạnh dài nhất theo như công thức của r (got it?)

Code như sau:
[ah]
Mã:
// nhập a, b, c kiểu double.
    
double p = (a + b + c) / 2,
       inv_R = sqrt(p / (p - a) / (p - b) / (p - c));
    
a = max(a, b < c ? c : b);
printf("%.3f\n", a / (2 + a * inv_R));
[/ah]
Good luck.
 

aloxinh_nb

It's Secret !
Mã:
#include<math.h>
 
int main ()
{   clrscr ();
    float a,b,c.r;
    cout << "Nhap a:";
    cin >>  a;
    cout << "Nhap b:";
    cin >>  a;
    cout << "Nhap c:";
    cin >>  c;


    if ( a+b > c || b+c>a || c+a>b)
    {
       r=(a*b)/(b+c+3a);
       cout << "Bán kinh lớn nhất của chiếc bánh là r =: " << r;


    }
    else
    {
    printf("\n Ba so ban vua nhap ko phai la do dai 3 canh cua 1 tam giac");
    }
    return 0;
}

đã tìm ra công thức test xem thế nào nhé, Còn phần làm tròn số thập phân bạn tự làm nhé
 
Bài này có nhiều cách làm. Bạn thử cái này xem nhé.

Nhận xét:
[ah]
Để 2 đường tròn thỏa mãn tính chất bài toán thì:
a) 2 đường tròn phải tiếp xúc nhau và tiếp xúc với các cạnh của tam giác.
b) Sẽ có 1 cạnh của tam giác phải tiếp xúc với cả 2 đường tròn. 2 cạnh còn lại chỉ tiếp xúc với 1 đường tròn.
c) Tâm của mỗi đường tròn phải nằm trên đường thẳng nối giữa tâm của đường tròn nội tiếp và 1 trong 3 đỉnh của tam giác.
[/ah]
Không mất tính tổng quát, giả sử 2 đường tròn cần tìm tiếp xúc với cạnh a của tam giác ABC như trong hình vẽ.
49hNPC.png

Gọi:
- r là bán kinh của bánh sinh nhật lớn nhất cần tìm (đường tròn nhỏ).
- R là bán kính của đường tròn nội tiếp tam giác ABC.
- p là nửa chu vi của tam giác ABC, tức là p = (a + b + c) / 2.
Mã:
[CENTER]1/R = sqrt( p / ((p-a)(p-b)(p-c)) ).[/CENTER]
Tại sao?
[ah]
Nếu A là diện tích của tam giác thì
- Ta dễ dàng thấy: A = p*R.
- Công thức Heron về diện tích tam giác: A = sqrt( p(p-a)(p-b)(p-c) ).
[/ah]

Gọi u, v, x, y là độ dài các cạnh theo như hình vẽ. Theo hệ quả của định lý Thales, ta có:
Mã:
u/x = r/R và v/y = r/R.

Mã:
a = u + 2r + v = (x/R)*r + 2r + (y/R)*r = (2 + a/R) * r,
ta có công thức tìm r như sau:
Mã:
[CENTER]r = a/(2 + a/R),[/CENTER]
với 1/R được tính như trên. Đây chính là công thức cần tìm.

Điểm cuối cùng: a phải là cạnh nào?
Trả lời: a phải là cạnh dài nhất theo như công thức của r (got it?)

Code như sau:
[ah]
Mã:
// nhập a, b, c kiểu double.
    
double p = (a + b + c) / 2,
       inv_R = sqrt(p / (p - a) / (p - b) / (p - c));
    
a = max(a, b < c ? c : b);
printf("%.3f\n", a / (2 + a * inv_R));
[/ah]
Good luck.
Em thử thấy đúng với trường hợp tam giác vuông do em tự làm. Em xem thử thì thấy đúng hết.
Cao thủ!!!!!! Em cám ơn anh. :clay:

Mã:
#include<math.h>
 
int main ()
{   clrscr ();
    float a,b,c.r;
    cout << "Nhap a:";
    cin >>  a;
    cout << "Nhap b:";
    cin >>  a;
    cout << "Nhap c:";
    cin >>  c;


    if ( a+b > c || b+c>a || c+a>b)
    {
       r=(a*b)/(b+c+3a);
       cout << "Bán kinh lớn nhất của chiếc bánh là r =: " << r;


    }
    else
    {
    printf("\n Ba so ban vua nhap ko phai la do dai 3 canh cua 1 tam giac");
    }
    return 0;
}

đã tìm ra công thức test xem thế nào nhé, Còn phần làm tròn số thập phân bạn tự làm nhé
Em cám ơn anh. Hình như k đúng với test đề bài lắm. Anh có ghi ra tại sao k ạ?
 

Em yêu Vforum

Cần tìm anh trai nuôi :)
Bài này có nhiều cách làm. Bạn thử cái này xem nhé.

Nhận xét:
[ah]
Để 2 đường tròn thỏa mãn tính chất bài toán thì:
a) 2 đường tròn phải tiếp xúc nhau và tiếp xúc với các cạnh của tam giác.
b) Sẽ có 1 cạnh của tam giác phải tiếp xúc với cả 2 đường tròn. 2 cạnh còn lại chỉ tiếp xúc với 1 đường tròn.
c) Tâm của mỗi đường tròn phải nằm trên đường thẳng nối giữa tâm của đường tròn nội tiếp và 1 trong 3 đỉnh của tam giác.
[/ah]
Không mất tính tổng quát, giả sử 2 đường tròn cần tìm tiếp xúc với cạnh a của tam giác ABC như trong hình vẽ.
49hNPC.png

Gọi:
- r là bán kinh của bánh sinh nhật lớn nhất cần tìm (đường tròn nhỏ).
- R là bán kính của đường tròn nội tiếp tam giác ABC.
- p là nửa chu vi của tam giác ABC, tức là p = (a + b + c) / 2.
Mã:
[CENTER]1/R = sqrt( p / ((p-a)(p-b)(p-c)) ).[/CENTER]
Tại sao?
[ah]
Nếu A là diện tích của tam giác thì
- Ta dễ dàng thấy: A = p*R.
- Công thức Heron về diện tích tam giác: A = sqrt( p(p-a)(p-b)(p-c) ).
[/ah]

Gọi u, v, x, y là độ dài các cạnh theo như hình vẽ. Theo hệ quả của định lý Thales, ta có:
Mã:
u/x = r/R và v/y = r/R.

Mã:
a = u + 2r + v = (x/R)*r + 2r + (y/R)*r = (2 + a/R) * r,
ta có công thức tìm r như sau:
Mã:
[CENTER]r = a/(2 + a/R),[/CENTER]
với 1/R được tính như trên. Đây chính là công thức cần tìm.

Điểm cuối cùng: a phải là cạnh nào?
Trả lời: a phải là cạnh dài nhất theo như công thức của r (got it?)

Code như sau:
[ah]
Mã:
// nhập a, b, c kiểu double.
    
double p = (a + b + c) / 2,
       inv_R = sqrt(p / (p - a) / (p - b) / (p - c));
    
a = max(a, b < c ? c : b);
printf("%.3f\n", a / (2 + a * inv_R));
[/ah]
Good luck.

Không còn gì để nói, quá xuất sắc. Lời giải đầy đủ kèm hình minh họa dễ hình dung.
 
Top