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

Đề tài: Tích n số lớn nhất trong m Số

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

    Mặc định Tích n số lớn nhất trong m Số

    yêu cầu của bài toán:
    nhập vào m số tự nhiên (có thể âm hoặc dương tùy chọn)
    sau đó nhập vào số phần tử cần tìm tích max
    VD nhập m số là m=4
    Và A[1]=2,A[2]=3,A[3]= -4,A[4]= -5
    Nhập n =2 thì max của 2 số trong 5 số là : -4*-5=20
    Yêu cầu bài toán tưởng chừng như rất đơn giản bằng việc sắp xếp mảng tăng sau đó lấy tích n số lớn nhất,nhưng điều đó chỉ áp dụng với số nguyên dương mà thôi
    Một số code tham khảo:
    PHP Code:
    #include <stdio.h>
    #include <conio.h>


    void sap_xep_giam(float A[],int bac)
    {
        
    int i,j;
        for(
    i=0;i<bac-1;i++)
            for(
    j=i+1;j<bac;j++)
                if(
    A[i]<A[j])
            
            { 
                    
    float tg=A[j];
                      
    A[j]=A[i];
                        
    A[i]=tg;
                }
    }
    void main()
    {
        
    float A[100],B[100],C[100];
        
    int a,m,i;

        do
        {
        
    printf("\nBan nhap vao so luong phan tu mang : ");
        
    scanf("%d",&a);
        }while(
    a<=0);
        do
        {
            
    printf("\nBan nhap vao m : ");
              
    scanf("%d",&m);
        }while(
    m<=0||m>a);

        for (
    i=0;i<a;i++)
        {
            
    printf("\nBan nhap vao phan tu thu %d : ",i+1);
            
    scanf("%f",&A[i]);
        }
        
    printf("\nBo %d so can tim la : \n",m);
        
    int b=0,c=0;
        for(
    i=0;i<a;i++)
        {    
            if(
    A[i]<0)
        
            {
                
    B[b]=A[i];
                
    b++;
            }
            else
                {
                    
    C[c]=A[i];
                    
    c++;
                }
        }    
           
        
    sap_xep_giam(B,b);
        
    sap_xep_giam(C,c);
        for(
    i=0;i<b;i++)
            
    A[i]=B[i];
        for(
    i=0;i<c;i++)
            
    A[i+b]=C[i];
        
    float max=1,tich=1;
        for(
    i=0;i<m;i++)
            
    max*=A[i];
        for(
    i=0;i<=a-m;i++)
        {  
    tich=A[i];
            for(
    int j=i+1;j<i+m;j++)
               
    tich*=A[j];
            if(
    max<tich)
                
    max=tich;
        }
       if(
    max)
       {
        for(
    i=0;i<=a-m;i++)
        {  
    tich=A[i];
            for(
    int j=i+1;j<i+m;j++)
               
    tich*=A[j];
            if(
    tich==max&&max!=0)
            {
                for(
    int k=i;k<i+m;k++)
                    
    printf("%f  ",A[k]);
                       
    printf("\n");
            }
        } 
       }
        else
        {
            
    printf("\nTich lon nhat cua %d so trong day so bang 0 ",m);
             
    printf("\nNen cac bo so do la tap hop cac bo %d so tu %d so cua day so do ",m,a);
        }
     

    Lưu các tích lên mảng,sau đó xét
    PHP Code:
    #include<stdio.h>
    #include<conio.h>

    void NhapMang (float A[100], int &n)
    {
        
    printf("Nhap n: ");
        
    scanf("%d", &n);

        
    float x;
        for (
    int i 0ni++)
        {
            
    printf("Nhap ptu thu %d: "1);
            
    scanf("%f", &x);
            
    A[i] = x;
        }
    }

    void XuatMang (float C[100][100], int mint o)
    {
        for (
    int i 0<= oi++)
        {
            for (
    int j 0mj++)
            {
                
    printf("%8.3f"C[i][j]);
            }
            
    printf("\n");
        }
    }

    void XoaDongThuk (float C[100][100], int &oint mint k)
    {
        for (
    int i 1i++)
        {
            for (
    int j 0mj++)
            {
                
    C[i][j] = C[1][j];
            }
        }
        
    o--;
    }

    int KiemTraDongTrung (float C[100][100], int xint yint m)
    {
        for (
    int i 0mi++)
        {
            if (
    C[x][i] != C[y][i])
            {
                return 
    0;
            }
        }
        return 
    1;
    }

    void XoaDongTrung (float C[100][100], int &oint m)
    {
        for (
    int i 0oi++)
        {
            for (
    int j 1<= oj++)
            {
                if (
    KiemTraDongTrung (Cijm) == 1)
                {
                    
    XoaDongThuk (Com1);
                    
    j--;
                }
            }
        }
    }

    float TimTichMax (float A[100], int nint m)
    {
        
    int B[100];
        
    float tich 1;
        
    float max;
        for (
    int i 0mi++)
        {
            
    B[i] = i;
            
    tich tich*A[B[i]];
        }
        
    int p 1;
        
    max tich;

        while (
    >= && != n)
        {
            
    tich 1;

            for (
    int k 0mk++)
            {
                
    tich tich*A[B[k]];
            }
            if (
    tich max)
            {
                
    max tich;
            }

            if (
    B[1] == 1)
            {
                
    p--;
            }
            else
            {
                
    1;
            }

            if (
    >= 0)
            {
                for (
    int j 1>= pj--)
                {
                    
    B[j] = B[p] + p;
                }
            }
        }
        return 
    max;
    }

    void LuuCacBoTichMaxVaoMang2Chieu (float A[100], float C[100][100], int nint mint &o)
    {
        
    int B[100];
        
    float tich 1;
        
    = -1;
        
    float max TimTichMax (Anm);

        for (
    int i 0mi++)
        {
            
    B[i] = i;
        }
        
    int p 1;

        while (
    >= && != n)
        {
            
    tich 1;

            for (
    int k 0mk++)
            {
                
    tich tich*A[B[k]];
            }
            if (
    tich == max)
            {
                
    o++;
                for (
    int l 0ml++)
                {
                    
    C[o][l] = A[B[l]]; 
                }
            }

            if (
    B[1] == 1)
            {
                
    p--;
            }
            else
            {
                
    1;
            }

            if (
    >= 0)
            {
                for (
    int j 1>= pj--)
                {
                    
    B[j] = B[p] + p;
                }
            }
        }
    }

    void main ()
    {
        
    float A[100];
        
    float C[100][100];
        
    int m;
        
    int n;
        
    int o;

        
    NhapMang (An);
        
    printf("\nNhap m: ");
        
    scanf("%d", &m);
        
    TimTichMax (Anm);
        
    LuuCacBoTichMaxVaoMang2Chieu (ACnmo);
        
    XuatMang (Cmo);
        
    XoaDongTrung (Com);
        
    printf("Sau khi xoa trung: \n");
        
    XuatMang (Cmo);
        
    getch();

    Còn đây là cách của mình,thuật toán cũng là lưu lên mảng thôi,nhưng được cái khá ngắn gọn:
    PHP Code:
    ///tim tich max cua n so trong m so cho truoc
    #include<iostream.h>
    #include<stdlib.h>
    using namespace std;
    int tich_n_1_so(int A[100],int m,int n,int i)
    {
        
    int s=1;//tich can tim
        
    for(int j=i;j<=i+n-2;++j)
        {
             
    s=s*A[i];
             
    cout<<" A["<<j<<"] x ";
        }
        return 
    s;//tra ve gia tri cua tich
    }
    void tinhmax(int A[100],int m,int n)
    {
        
    //khai bao mang chua cac tich da duoc dua len mang
        
    int tich[100][100];
        
    int max;
        
    //gan len mang
        
    cout<<"\nTICH "<<n<<" SO LA:";
        for(
    int i=1;i<=m-n+1;++i)
        for(
    int j=i+1;j<=m;++j)
        {
             
    tich[i][j]=tich_n_1_so(A,m,n,i)*A[j];
             
    cout<<"A["<<j<<"]= "<<tich[i][j]<<"\n";
        }
        
    max=tich[1][1];
        for(
    int i=1;i<=m-n+1;++i)
        for(
    int j=i+1;j<=m;++j)
        {
            if(
    tich[i][j]>=max)
            {
                
    max=tich[i][j];
            }
        }
        
    cout<<"\nTICH LON NHAT LA: "<<max;
    }
    int main()
    {
        
    int A[100];
        
    int m;//tong tat ca cac phan tu
        
    int n;//so phan tu can tim tich max
        //nhap n so
        
    cout<<"NHAP TONG SO PHAN TU M:";
        
    cin>>m;
        for(
    int i=1;i<=m;++i)
        {
            
    cout<<"A["<<i<<"]: ";
            
    cin>>A[i];
        }
        
    //nhap n phan tu lon nhat
        
    cout<<"NHAP SO PHAN TU CAN TIM MAX N: ";
        
    cin>>n;
        
    tinhmax(A,m,n);
        return 
    0;

    thấy nhiều bạn có ý kiến có khả năng chuyển bài toán theo phương pháp quy hoạch động,các bạn thử cho ý kiến xem
    Đã được chỉnh sửa lần cuối bởi AlexF : 24-07-2008 lúc 11:53 AM.

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

    Bài rút gọn của cậu chạy trên máy tớ bị sai .... nhập 4 số, -1,-2,-3,4, tìm max tích của 3 số nó ra 1 loạt các trg` hợp (có cái sai), max luôn ra 19849....

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

    cậu đưa chương trình lên đi,mình dùng CFREE biên dịch

  4. #4
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    À bài này mình cũng làm lâu rồi, cách của mình tuy không ngắn hơn nhưng cũng post lên mọi người test dùm.
    Với bài này cách ngắn nhất có thể dùng đệ quy, cái này có trong sách của GS.Phạm Văn Ất.
    Code:
    /*  Tim m so co tich lon nhat trong n so cua mang
        Co 2 TH dac biet: - Toan am or toan duong.
                          - phan con lai toan am hoac toan duong.
    */
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    void sortArray(int *a,int n);
    int count(int *a,int n);
    
    int main()
    {
        int n;
        printf("Please, enter an integer number: ");scanf("%d",&n);
        int *a;
        a= (int*) malloc(n*sizeof(int));
        if (a==NULL) printf("Error allocating memory.");
        printf("\n     ::Enter array::\n");
        int i;
        for (i=0;i<n;++i)
        {
            printf("A[%d] = ",i);scanf("%d",&a[i]);
        }
        printf("\n    ::Show array::\n");
        for (i=0;i<n;++i)printf("  %d  ",a[i]);
        sortArray(a,n);
        printf("\n");
        int m,s=1;
        do  {
            printf("\nEnter value m = ");scanf("%d",&m);
            } while(m<=0 || m>n);
        if (count(a,n)==0)
        {
            printf("\n - %d value, multiply maximum: ",m);
            i=0;
            while(i<m){printf(" %d ",a[i]);s*=a[i];i++;}
            printf("\n   Multiply %d",s);
        }
        else if (count(a,n)==n)
        {
            printf("\n - %d value, multiply maximum: ",m);
            i=0;
            while(i<m){printf(" %d ",a[n-i-1]);s*=a[n-i-1];i++;}
            printf("\n   Multiply %d",s);
        }
        else
        {
            int b;
            if (count(a,m-1)%2==0)
            {
                b=0;
                for (i=m-1;i<n;i++)
                    if (a[i]>=0)
                    {
                        b=a[i];
                        a[i]=a[m-1];
                        a[m-1]=b;
                        b=1;
                        break;
                    }
                if (b==0)
                    for (i=m-2;i>=0;--i)
                    if (a[i]>=0)
                    {
                        b=a[m];
                        a[m]=a[i];
                        a[i]=b;
                        break;
                    }
                printf("\n - %d value, multiply maximum: ",m);
                i=0;
                while(i<m){printf(" %d ",a[i]);s*=a[i];i++;}
                    printf("\n   Multiply %d",s);
            }
            else
            {
                b=0;
                for (i=m-1;i<n;i++)
                    if (a[i]<=0)
                    {
                        b=a[i];
                        a[i]=a[m-1];
                        a[m-1]=b;
                        b=1;
                        break;
                    }
                if (b==0)
                    for (i=m-2;i>=0;--i)
                    if (a[i]<=0)
                    {
                        b=a[m];
                        a[m]=a[i];
                        a[i]=b;
                        break;
                    }
                printf("\n - %d value, multiply maximum: ",m);
                i=0;
                while(i<m){printf(" %d ",a[i]);s*=a[i];i++;}
                    printf("\n   Multiply %d",s);
            }
        }
        free (a);
    }
    
    void sortArray(int *a,int n)
    {
        int i,j,temp;
        for (i=0;i<n-1;i++)
            for (j=i+1;j<n;++j)
                if (fabs(a[i])< fabs(a[j]))
                {
                    temp=a[i];
                    a[i]=a[j];
                    a[j]=temp;
                }
    }
    
    int count(int *a,int n)
    {
        int i,c=0;
        for (i=0;i<n;++i)
            if (a[i]<0)c++;
        return c;
    }

  5. #5
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Mình chưa test hết, mình mới test cái code rút gọn của coder_gate

    Không phải chỉ kết quả có vấn đề mà nó tính tích cũng có vấn đề luôn.
    Mà nó tính cả tích 1 2 2 và 2 3 3 thế kia thì có nhiều lỗi lắm đó.
    Các bạn test dùm cách mình đi nhé, cách của mình có vẻ hay đấy.
    Đã được chỉnh sửa lần cuối bởi QuangHoang : 30-07-2008 lúc 03:20 PM.

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

    Mặc định Tích n số lớn nhất trong m Số

    đang test ^^

    Đã được chỉnh sửa lần cuối bởi 6220119 : 30-07-2008 lúc 04:09 PM.

  7. #7
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Híc mình chưa tính đến TH này, đáng phải đổi 4 cho -2 thì nó lại đổi -3 cho 0.

    @ Mình biết rồi đang sửa.
    Đã được chỉnh sửa lần cuối bởi QuangHoang : 30-07-2008 lúc 04:58 PM.

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

    (mới edit lại, có lỗi mới kìa -.-')
    Đã được chỉnh sửa lần cuối bởi 6220119 : 30-07-2008 lúc 04:13 PM.

  9. #9
    Ngày gia nhập
    01 2008
    Bài viết
    18

    uhm,bài của mình mình nhận ra lỗi rồi,nó chỉ đúng với 3 số thôi,mình đang cố sức code lại

  10. #10
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Đã sửa và thử với 2 trường hợp trên, ok.
    Tiếp tục test giúp mình nhé.

    Code:
    /*  Tim m so co tich lon nhat trong n so cua mang
        Co 2 TH dac biet: - Toan am or toan duong.
                          - phan con lai toan am hoac toan duong.
    */
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    void sortArray(int *a,int n);
    int count(int *a,int t,int n);
    
    int main()
    {
         int n;
         printf("Please, enter an integer number: ");scanf("%d",&n);
         int *a;
         a= (int*) malloc(n*sizeof(int));
         if (a==NULL) printf("Error allocating memory.");
         printf("\n     ::Enter array::\n");
         int i;
         for (i=0;i<n;++i)
         {
              printf("A[%d] = ",i);scanf("%d",&a[i]);
         }
         printf("\n    ::Show array::\n");
         for (i=0;i<n;++i)printf("  %d  ",a[i]);
         sortArray(a,n);                          //Sap xep lai mang, giam dan theo tri tuyet doi
         printf("\n");
         int m,s=1;
         do   {
              printf("\nEnter value m = ");scanf("%d",&m);      //nhap m
              } while(m<=0 || m>n);
    
         if (m==n)                                                        //TH: m=n
         {
              printf("\n * %d value, multiply maximum: ",m);
              i=0;
              while(i<m){printf(" %d ",a[i]);s*=a[i];i++;}
              printf("\n   Multiply %d",s);
         }
         else if (count(a,0,m) % 2==0)                              //Xet m so dau co chan la cac so am
         {
              printf("\n * %d value, multiply maximum: ",m);
              i=0;
              while(i<m){printf(" %d ",a[i]);s*=a[i];i++;}
              printf("\n   Multiply %d",s);
         }
         else if(count(a,0,n)==n)                               //Neu toan bo la so am
         {
              printf("\n - %d value, multiply maximum: ",m);
              i=0;
              while(i<m){printf(" %d ",a[n-i-1]);s*=a[n-i-1];i++;}
              printf("\n   Multiply %d",s);
         }
         else
         {
              if (count(a,0,m)==m)
              {                             //Neu m so dau toan am
                   for (i=m;i<n;i++)
                        if (a[i]>=0)
                        {
                             int b=a[i];
                             a[i]=a[m-1];
                             a[m-1]=b;
                             break;
                        }
                   printf("\n * %d value, multiply maximum: ",m);
                   i=0;
                   while(i<m){printf(" %d ",a[i]);s*=a[i];i++;}
                   printf("\n   Multiply %d",s);
              }
              else if (count(a,m,n)==(n-m))
              {                           //Neu n-m so sau toan am
                   for (i=m-1;i>=0;i--)
                        if (a[i]>=0)
                        {
                             int b=a[i];
                             a[i]=a[m];
                             a[m]=b;
                             break;
                        }
                   printf("\n * %d value, multiply maximum: ",m);
                   i=0;
                   while(i<m){printf(" %d ",a[i]);s*=a[i];i++;}
                   printf("\n   Multiply %d",s);
              }
              else                        //TH: co ca am va duong o 2 phan
              {
                   int s1=1,s2=1,t1,t2,t3,t4;
                   for (i=m;i<n;i++)          //Thu tich 1
                        if (a[i]>=0)
                        {
                             t1=i;
                             break;
                        }
                   for (i=m-1;i>=0;i--)
                        if (a[i]<0)
                        {
                             t2=i;
                             break;
                        }
                   i=0;
                   while(i<m)
                   {
                        if (i==t2)s1*=a[t1];
                        else s1*=a[i];
                        i++;
                   }
                   for (i=m;i<n;i++)           //Thu tich 2
                        if (a[i]<0)
                        {
                             t3=i;
                             break;
                        }
                   for (i=m-1;i>=0;i--)
                        if (a[i]>=0)
                        {
                             t4=i;
                             break;
                        }
                   i=0;
                   while(i<m)
                   {
                        if (i==t4)s2*=a[t3];
                        else s2*=a[i];
                        i++;
                   }
                   if (s1>s2)                   //So sanh 2 tich, dua kq
                   {
                        int b=a[t1];
                        a[t1]=a[t2];
                        a[t2]=b;
                        printf("\n * %d value, multiply maximum: ",m);
                        i=0;
                        while(i<m){printf(" %d ",a[i]);s*=a[i];i++;}
                        printf("\n   Multiply %d",s);
                   }
                   else
                   {
                        int b=a[t3];
                        a[t3]=a[t4];
                        a[t4]=b;
                        printf("\n * %d value, multiply maximum: ",m);
                        i=0;
                        while(i<m){printf(" %d ",a[i]);s*=a[i];i++;}
                        printf("\n   Multiply %d",s);
                   }
              }
         }
    
        free (a);
    }
    
    void sortArray(int *a,int n)
    {
        int i,j,temp;
        for (i=0;i<n-1;i++)
            for (j=i+1;j<n;++j)
                if (fabs(a[i])< fabs(a[j]))
                {
                    temp=a[i];
                    a[i]=a[j];
                    a[j]=temp;
                }
    }
    
    int count(int *a,int t,int n)
    {
        int i,c=0;
        for (i=t;i<n;++i)
            if (a[i]<0)c++;
        return c;
    }
    Đã được chỉnh sửa lần cuối bởi QuangHoang : 30-07-2008 lúc 10:19 PM.

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

  1. Trả lời: 6
    Bài viết cuối: 01-05-2013, 11:10 AM
  2. Socket trong phần mềm chat video, làm thế nào để tín hiệu nhận được nhanh nhất.
    Gửi bởi toctai trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 13-06-2012, 09:19 AM
  3. Tim từ ngắn nhất và dài nhất trong chuổi lỗi has stopped working?
    Gửi bởi satthuprao trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 3
    Bài viết cuối: 27-05-2012, 11:51 AM
  4. Code cho ẩn kí tự khi nhập password vào textbox trong form đăng nhập
    Gửi bởi mrkiemhiep trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 6
    Bài viết cuối: 16-03-2011, 11:10 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