Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 22 kết quả

Đề tài: Từ 1 số p phân tích ra tổng rồi tìm tích lớn nhất

  1. #1
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    Mặc định Từ 1 số p phân tích ra tổng rồi tìm tích lớn nhất

    anh em trong diễn đàn có thể gợi ý cho mình thuật toán làm bài này được không
    cho 1 số nguyên dương p
    phân tích p ra thành tổng các số nguyên dương
    in ra màn hình cặp gồm nhiều số có tổng là P và có tích lớn nhất

  2. #2
    Ngày gia nhập
    08 2008
    Bài viết
    22

    Tớ mới chỉ tìm được 1 cận dưới khá tốt, đánh giá dựa trên BĐT Cauchy, chưa khẳng định đc đây có phải là kết quả ko. Mọi người cho ý kiến nhá.
    C++ Code:
    1. /*
    2. http://forums.congdongcviet.com/showthread.php?t=9055
    3. (c) Berberin
    4. */
    5.  
    6.  
    7. #include <iostream>
    8. #include <cstdlib>
    9. #include <cmath>
    10.  
    11. using namespace std;
    12. //////////////////////////////////////////////////////////////////////////////////////
    13. int main(){
    14.     unsigned S = 10;
    15.        
    16.     /*Cauchy
    17.     for (unsigned n = 1; n<=S; n++)
    18.         cout <<n <<'\t' <<float(S)/n <<'\t' <<powf(float(S)/n, n) <<endl;  
    19.     cout <<endl;
    20.     */ 
    21.  
    22.     unsigned P = S, N = 1; 
    23.     for (unsigned n = 2; n<S; n++){
    24.         unsigned x = S/n;
    25.         unsigned p = powf(x, n-S%n)*powf(x+1, S%n);    
    26.         if (p > P){
    27.             P = p;
    28.             N = n;
    29.         }
    30.     }
    31.    
    32.     cout <<"Result: " <<endl;
    33.     cout <<S <<"--> (" <<S/N <<"^" <<N-S%N <<')';
    34.     if (S%N > 0)
    35.         cout <<"x(" <<S/N+1 <<"^" <<S%N <<")";
    36.     cout <<" = " <<P <<endl;
    37.  
    38.     system("pause");
    39.     return EXIT_SUCCESS;
    40. }
    41. //////////////////////////////////////////////////////////////////////////////////////
    Đã được chỉnh sửa lần cuối bởi Berberin : 17-08-2008 lúc 02:55 AM. Lý do: bug

  3. #3
    Ngày gia nhập
    08 2008
    Bài viết
    13

    Trích dẫn Nguyên bản được gửi bởi coder_gate Xem bài viết
    cho 1 số nguyên dương p
    phân tích p ra thành tổng các số nguyên dương
    in ra màn hình cặp gồm nhiều số có tổng là P và có tích lớn nhất
    Tức là phân tích p ra thành tổng nhiều số ah`,hay chỉ là 2 số thôi rồi tìm xem cặp nào có tích lơn nhất..Bạn thử ví dụ được không?

  4. #4
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    Mặc định Từ 1 số p phân tích ra tổng rồi tìm tích lớn nhất

    thich ra bao nhieu so chang duoc,quan trọng là không lẫn số âm là được
    to Berberin
    mình nghĩ bài của cậu co van de,cậu thử với số 100 nha,đáp số của cậu nhỏ hơn đáp số của mình rất nhiều mình cũng mới chứng minh bằng toán học được rằng để tích lớn nhất thì bắt buộc phải phân tích ra n lần số 3 và k lần số 2 trong đó 3 được ưu tiên trước và 2 được dùng để lấp chỗ trống của 3 ( k chỉ có thể =0 hoặc 1 hoặc 2 )
    x= 3*m +2*k ( với k chỉ có thể =0 hoặc 1 hoặc 2 )
    day la code cua minh

    C++ Code:
    1. #include<iostream>
    2. #include<stdlib.h>
    3. #include<math.h>
    4. #include <iomanip.h>
    5. int main()
    6. {
    7.     int a,solan3;
    8.     float solan2;
    9.     std::cout<<"NHAP SO CAN PHAN TICH A: ";
    10.     std::cin>>a;
    11.     solan3=a/3;
    12.     solan2= float( a - solan3 * 3 ) / 2;
    13.     if( a - solan3 * 3 <2&&a-solan3 *3 !=0)
    14.     {
    15.         solan3=a/3-1;
    16.         solan2= ( a - solan3 * 3 ) / 2;
    17.     }
    18.     if(solan2!=0){
    19.     std::cout<<"so da cho A = "<<a<<" duoc phan tich : 3 x "<<solan3<<"+ 2 x "<<solan2<<" = "<<3*solan3 +2*solan2;
    20.     std::cout<<"\n TICH MAX LA: 3^"<<solan3<<" x 2^"<<solan2<<" = "<<setiosflags(ios::showpoint) << setprecision(100) <<pow(3,solan3)*pow(2,solan2);
    21.     }
    22.     else
    23.     {
    24.         std::cout<<"so da cho A = "<<a<<" duoc phan tich : 3 x "<<solan3<<"+ 2 x "<<solan2<<" = "<<3*solan3 +2*solan2;
    25.         std::cout<<"\n TICH MAX LA: 3^ "<<solan3<<" = "<<setiosflags(ios::showpoint) << setprecision(100) <<pow(3,solan3)*pow(2,solan2);
    26.     }
    27.     system("pause");
    28.     return 0;
    29. }

    đây là bài của cậu với số 100

    C++ Code:
    1. #include <iostream>
    2. #include <cstdlib>
    3. #include <cmath>
    4.  
    5. using namespace std;
    6. //////////////////////////////////////////////////////////////////////////////////////
    7. int main(){
    8.    unsigned S = 100;
    9.        
    10.     /*Cauchy
    11.     for (unsigned n = 1; n<=S; n++)
    12.         cout <<n <<'\t' <<float(S)/n <<'\t' <<powf(float(S)/n, n) <<endl;  
    13.     cout <<endl;
    14.     */
    15.  
    16.     unsigned P = S, N = 1;
    17.     for (unsigned n = 2; n<S; n++){
    18.         unsigned x = S/n;
    19.         unsigned p = powf(x, n-S%n)*powf(x+1, S%n);    
    20.         if (p > P){
    21.             P = p;
    22.             N = n;
    23.         }
    24.     }
    25.    
    26.     cout <<"Result: " <<endl;
    27.     cout <<S <<"--> (" <<S/N <<"^" <<N-S%N <<')';
    28.     if (S%N > 0)
    29.         cout <<"x(" <<S/N+1 <<"^" <<S%N <<")";
    30.     cout <<" = " <<P <<endl;
    31.  
    32.     system("pause");
    33.     return EXIT_SUCCESS;
    34. }
    Đã được chỉnh sửa lần cuối bởi AlexF : 17-08-2008 lúc 04:18 PM.

  5. #5
    Ngày gia nhập
    08 2008
    Bài viết
    22

    Trích dẫn Nguyên bản được gửi bởi coder_gate Xem bài viết
    thich ra bao nhieu so chang duoc,quan trọng là không lẫn số âm là được

    mình nghĩ bài của cậu co van de,cậu thử với số 100 nha,đáp số của cậu nhỏ hơn đáp số của mình rất nhiều
    Do tớ dùng kiểu unsigned nên bị tràn, thay kiểu của 2 biến p và P là ok. Chẳng hạn với unsigned long long p, P
    Code:
    Result:
    100--> (3^32)x(4^1) = 7412080613261312
    Trích dẫn Nguyên bản được gửi bởi coder_gate Xem bài viết
    mình cũng mới chứng minh bằng toán học được rằng để tích lớn nhất thì bắt buộc phải phân tích ra n lần số 3 và k lần số 2 trong đó 3 được ưu tiên trước và 2 được dùng để lấp chỗ trống của 3 ( k chỉ có thể =0 hoặc 1 hoặc 2 )
    x= 3*m +2*k ( với k chỉ có thể =0 hoặc 1 hoặc 2 )
    Thế hả, kq đẹp nhỉ, xin chúc mừng . Cách của tớ ko đẹp nhưng cũng cm xong rồi, nếu xét thêm tí nữa chắc cũng thu đc kq của cậu nhưng tớ lười nên xài vòng for .
    Đã được chỉnh sửa lần cuối bởi Berberin : 18-08-2008 lúc 12:17 AM.

  6. #6
    Ngày gia nhập
    12 2007
    Bài viết
    28

    Mặc định Từ 1 số p phân tích ra tổng rồi tìm tích lớn nhất

    Bài này bản chất là một bài toán mà ^^. Kết quả của bạn coder gate đúng rồi . Nếu mình nhớ không nhầm, hình như đây là một bài thi trong series của Topcoder, đã từng được anh rox_rook giới thiệu trên forum mình một lần.
    Chúc mừng bạn coder_gate nghen!

  7. #7
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    Mặc định Từ 1 số p phân tích ra tổng rồi tìm tích lớn nhất

    C++ Code:
    1. /*
    2. http://forums.congdongcviet.com/showthread.php?t=9055
    3. (c) Berberin
    4. */
    5.  
    6.  
    7. #include <iostream>
    8. #include <cstdlib>
    9. #include <cmath>
    10.  
    11. using namespace std;
    12. //////////////////////////////////////////////////////////////////////////////////////
    13. int main(){
    14.     unsigned long S = 100;
    15.        
    16.     /*Cauchy
    17.     for (unsigned n = 1; n<=S; n++)
    18.         cout <<n <<'\t' <<float(S)/n <<'\t' <<powf(float(S)/n, n) <<endl;  
    19.     cout <<endl;
    20.     */
    21.  
    22.     unsigned long  P = S, N = 1;
    23.     for (long n = 2; n<S; n++){
    24.         long x = S/n;
    25.         unsigned long p = powf(x, n-S%n)*powf(x+1, S%n);    
    26.         if (p > P){
    27.             P = p;
    28.             N = n;
    29.         }
    30.     }
    31.    
    32.     cout <<"Result: " <<endl;
    33.     cout <<S <<"--> (" <<S/N <<"^" <<N-S%N <<')';
    34.     if (S%N > 0)
    35.         cout <<"x(" <<S/N+1 <<"^" <<S%N <<")";
    36.     cout <<" = " <<P <<endl;
    37.  
    38.     system("pause");
    39.     return EXIT_SUCCESS;
    40. }

    Do tớ dùng kiểu unsigned nên bị tràn, thay kiểu của 2 biến p và P là ok. Chẳng hạn với unsigned long long p, P


    Result:
    100--> (3^32)x(4^1) = 7412080613261312
    híc,tràn số hay không thì tớ kô rõ nhưng mà dù có sửa bài cậu hay là để nguyên thì giá trị vẫn trả về là 2^17 * 3^22 mà,dù không thực hiện phép nhân mình cũng biết chắc chắn nó sẽ nhỏ hơn kết quả của mình
    đã chứng minh roài ...

  8. #8
    Ngày gia nhập
    08 2008
    Bài viết
    22

    Uhm, cậu có đọc code của tớ không vậy? Hay chỉ F5? Trong vòng for đó chứa cách làm của cậu đấy, vậy nó sai thế nào được?
    Do tớ dùng kiểu unsigned nên bị tràn, thay kiểu của 2 biến p và P là ok. Chẳng hạn với unsigned long long p, P
    Đề nghị thêm 1 chữ long nữa đi, 1 long hơi ngắn.

    Đây là kq của bài của cậu với số cần phân tích = 100
    Code:
    NHAP SO CAN PHAN TICH A: 100
    so da cho A = 100 duoc phan tich : 3 x 32+ 2 x 2 = 100
     TICH MAX LA: 3^32 x 2^2 = 7412080613261312.000000000000000000000000000000000000000000000000000000000000000000000000000000000000

  9. #9
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    Chẳng hạn với unsigned long long p, P
    mình chưa từng biết đến kiểu này,mà có thử cũng báo lỗi....có gì xin bạn chỉ giáo

  10. #10
    Ngày gia nhập
    08 2008
    Bài viết
    6

    Post bài chứng minh nên đi xem nào sao cứ nói xuông vậy

Các đề tài tương tự

  1. Sửa máy tính, cài đặt windows, phần mềm tại nhà nhanh nhất, rẻ nhất, hiệu quả nhất …
    Gửi bởi hopluccc trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 08-07-2013, 02:07 PM
  2. Trả lời: 12
    Bài viết cuối: 25-10-2012, 02:48 AM
  3. Bài tập C++ NHập mảng một chiều gồm n phần tử kết thúc nhập khi nhập một chữ cái
    Gửi bởi thienthanoze trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 15
    Bài viết cuối: 09-07-2012, 10:10 PM
  4. Bài tập C++ Viết phương trình nhập vào 1 chuỗi số.Hãy nhập vào 1 số.Đếm xem có bao nhiêu chữ số bạn vừa nhập
    Gửi bởi namtuocdn trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 5
    Bài viết cuối: 16-10-2011, 10:39 AM
  5. Bài tập C++ Nhập mảng 1 chiều, nếu phần tử nhập trùng nhau thì bắt nhập lại
    Gửi bởi danielh trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 09-07-2011, 03:35 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn