Announcement

Collapse
No announcement yet.

[C] kiểm tra xem mảng tăng hay giảm hay không tăng không giảm

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • #16
    Mình cũng bon chen chế một đoạn code cho hàm kiểm tra mảng :sure:
    Về mặt lý thuyết mình nghĩ nếu số lượng phần tử array lớn thì kết quả của hàm này trả về là khá nhanh với mảng là không tăng không giảm (đề bài random thì trường hợ này xảy ra thường xuyên nhất) vì nó sẽ thoát ra ngay lúc phát hiện có sự thay đổi, biến t trong hàm này mình đại diện cho xu hướng của mảng.
    Không biết có sai chỗ nào không :doubt:


    Code:
    void check(int a[], int n) {
        int i = 0;
        int t = -1;
        for(; i < n - 1 ; ++i) {
            if(t != -1 && (a[i] != a[i + 1]) && (t ^ (a[i] > a[i + 1]))){
                printf("Mang khong tang khong giam");
                return;
            }
            t = (a[i] == a[i + 1]) ? t : (a[i] > a[i + 1]);
         }
        if(a[0] < a[n - 1]) {
            printf("Mang tang");
            return;
        }
        if(a[0] > a[n - 1]) {
            printf("Mang giam");
            return;
        }
        printf("Mang hang");
    }

    Comment


    • #17
      Rảnh benmark thử cái hàm trên của mình so với cách thông thường là duyệt hết mảng cho kết quả cũng tạm được :boss:

      Cái hàm mình time trả về là time1, hàm kia là time2.

      Trường hợp xấu nhất (mảng hằng): duyệt qua hết mảng
      bm1.png

      Trường hợp random mảng:
      bm2.png

      Ngồi rảnh rỗi nghĩ lại thì mình đánh giá sai trường hợp xấu nhất đối với hàm của mình: trường hợp xấu nhất là mảng tăng (hoặc giảm) thì thời gian time1 hơn gấp đôi time2 :sweat:
      Last edited by 08520021; 06-12-2012, 01:54.

      Comment


      • #18
        Originally posted by 12520471 View Post
        là sao huynh...e nghj~ i<n thì i chạy đến n-1 là dừng đúng rùi mà!!!!:confuse:
        =)) i+1 mà e nên e phải cho nó tới n-1 thôi chứ sao e tham thêm 1 số zậy
        Delete:brick::brick:

        Comment


        • #19
          Originally posted by 12520471 View Post
          đề bài là cho 1 mảng gồm n phần tử ngẫu nhiên( n nhập từ bàn phím)...kiểm tra xem mảng tăng hay giảm hay không tăng không giảm!!!
          tình hình là Chương trình chạy được nhưng khi mảng giảm hoặc tăng thì nó k print ra màn hình!!!!
          e nghĩ nó sai ở đâu đó chỗ "dem"...
          các huynh tìm lỗi dùm e...
          Code:
          #include "stdafx.h"
          #include <stdio.h>
          #include <conio.h>
          #include <stdlib.h>
          #include <time.h>
          void xuatmang(int a[],int b)
          {
          	for(int i=0;i<b;i++)
          		printf("%4d",a[i]);
          }
          void kiemtra(int a[],int b)
          {
          	int dem=0;
          	for(int i=0;i<b;i++)
          	{
          		if(a[i]==a[i+1]) dem++;
          		if(a[i]<a[i+1])
          		{
          			if(a[i+1]>a[i+2])
          			{
          				printf("\nmang k tang k giam");
          				break;
          			}
          			else
          				dem++;
          		}
          		if(a[i]>a[i+1])
          		{
          			if(a[i+1]<a[i+2])
          			{
          				printf("\nmang k tang k giam");
          				break;
          			}
          			else
          				dem=dem+2;
          		}
          	}
          	if(dem==b-1) printf("\nmang tang");
          	if(dem==(b-1)*2) printf("\nmang giam");
          }
          void main()
          {
          	int n,A[100];
          	printf("nhap so phan tu cua mang dy kung: ");
          	scanf("%d",&n);
          	srand(time(NULL));
          	for(int i=0;i<n;i++)
          		A[i]=rand()%100;
          	xuatmang(A,n);
          	kiemtra(A,n);
          	getch();
          }
          theo mình thì nên nhập "bằng tay" các giá trị trong mảng chứ đừng random, bởi random nó có khi nào in ra mảng tăng đâu, chỉ toàn in ra mảng ko tăng thui....
          Hãy cứ sống một cách thật tuyệt vời, rồi những điều tốt đẹp sẽ đến với bạn !!

          Comment


          • #20
            mình cũng là dân gà công nghiệp nên viết đơn giản thế này còn giúp đc gì thì giúp nhá.... ps: ko biết có sai đề ko :sad:

            # include <stdio.h>
            # include <conio.h>
            void ktra(int a[],int n)
            {
            int m=a[0], dem=1;
            for (int i=0;i<n;++i)
            if (a[i]>m)
            {
            m=a[i]; dem++;
            }
            if (dem==n) printf("mang tang");
            else printf("mang ko tang");
            }
            void nhap(int a[],int n)
            {

            for (int i=0;i<n;++i)
            { printf("nhap");
            scanf("%d",&a[i]);}
            }
            void main()
            {
            int a[20],n;
            printf("nhap n: ");
            scanf("%d",&n);
            nhap(a,n);
            ktra(a,n);
            getch();
            }
            Hãy cứ sống một cách thật tuyệt vời, rồi những điều tốt đẹp sẽ đến với bạn !!

            Comment


            • #21
              Originally posted by 11520285 View Post
              Em cũng 1 for 5 hoặc 6 if thôi này.

              Code anh ấy bị lỗi vòng lập. Bạn fix lại cho nó chạy tới n-1 thôi là đúng nha.
              Originally posted by 12520471 View Post
              là sao huynh...e nghj~ i<n thì i chạy đến n-1 là dừng đúng rùi mà!!!!:confuse:
              Sorry thớt và cảm ơn bạn nhé, mình lười test quá nên code bug ko để ý. Mình đã sửa a[i] vs a[i + 1] thành a[i - 1] và a[i] rồi nhé. Lúc đấy đoảng quá

              @Mấy bạn khác: Hàm 1 for là nhanh rồi đó, benchmark không khác nhau đâu. Bạn nào siêng và pro rồi thì làm thêm cái break như bài của anh Ân ở #17 là best solution đó, nhưng nếu performance không cần phải best thì mình hay theo trường phái "Code càng ít càng tốt" ^_^ Debug cho dễ í mà
              Last edited by 09520019; 06-12-2012, 03:26.
              Khoảng cách giữa bạn và ước mơ của bạn là bao xa ?

              Comment

              LHQC

              Collapse
              Working...
              X