01/10/2018, 10:04

Lỗi bài toán số tăng giảm

Chào mọi người,mình có 2 cái hàm nhỏ trong bài contest,đó là số tăng giảm.
Vấn đề là,nếu mình tách riêng từ hàm,tức chỉ xét 1 trong 2 dãy tăng hoặc giảm thì mọi thứ đều okay,nhưng nếu mình gộp hàm lại thì kết quả lại sai.điển hình là số 12342 này.
Mọi người chỉ giúp mình với ạ,xin cảm ơn! <3
code: http://codepad.org/Wt1zMkUJ

Trần Hoàn viết 12:12 ngày 01/10/2018

Mình lười đọc code của bạn quá. Nhưng mình cho bạn một thuật toán thế này, dễ code, ít lỗi:
Gọi mảng đầu vào là int[] P.
Nếu (P[i] - P[i - 1]) * (P[i] - P[i + 1]) > 0 thì đoạn P[i - 1] đến P[i + 1] là đoạn tăng giảm

Summary
#include <stdio.h>
#include <conio.h>
int TangGiam(int Input[], int n)
{
    int i;
    for (i = 1; i < n - 1; i += 1)
        if ((Input[i] - Input[i - 1]) * (Input[i] - Input[i + 1]) < 0)
            return 0;
    return 1;
}
int main()
{
    int m;
    int n = 0;
    int P[100];
    printf("Nhap so dau vao: ");
    scanf("%d",&m);
    while (m > 0)
    {
        P[n] = m % 10;
        m /= 10;
        n += 1;
    }
    if (TangGiam(P, n))
        printf("La so tang giam");
    else
        printf("Khong la so tang giam");
    getch();
    return 0;
}
Nguyễn Hồng Cường viết 12:17 ngày 01/10/2018

Thuật toán rất hay,cám ơn bạn!
Nhưng mình đang thắc mắc code của mình,do đây chỉ là 2 hàm nhỏ thôi nên phải biết lỗi mới xử lý các hàm khác được :((

rogp10 viết 12:10 ngày 01/10/2018

Kiểu như 13241 ấy à? Cái đó có liên quan đến biểu thức sign*(a[i] - a[i-1]) > 0 với sign = +/-1. Nếu điều kiện sai thì thoát ngay và mỗi lần lặp phải đổi dấu sign.

Nguyễn Hồng Cường viết 12:13 ngày 01/10/2018

@rogp10 sign là gì hả b

Trần Hoàn viết 12:17 ngày 01/10/2018

sign là một biến kiểu bool, thể hiện là số này cần phải tăng hay giảm. nếu số đó cần phải tăng mà lại giảm thì thông báo không phải số tăng giảm rồi thoát ngay.

Nguyễn Hồng Cường viết 12:20 ngày 01/10/2018

@noz1995 mình thay thế nó bằng return 0; rồi mà nhỉ :<

Trần Hoàn viết 12:07 ngày 01/10/2018

Còn code của bạn thì không liên quan gì đến cái đề bài cả. Hai hàm tang() và giam() là hàm kiểm tra xem dãy đó là dãy tăng hay dãy giảm, còn dãy tăng giảm thì không phải là cả 2 loại đó, hành vi của chương trình là sai. Ví dụ nếu bạn nhập dãy mà một nửa tăng một nửa giảm thì nó sẽ báo là có (12342)

Nguyễn Hồng Cường viết 12:07 ngày 01/10/2018

2 hàm tách biệt nhau sao lại nửa tăng nửa giảm vẫn thỏa mãn được nhỉ?

rogp10 viết 12:09 ngày 01/10/2018

sign=-1 thì thành ra a[i-1] - a[i] > 0, hay a[i] < a[i-1].

Nguyễn Hồng Cường viết 12:05 ngày 01/10/2018

Mình k dùng mảng bài này do còn 1 vài hàm khác nữa,mà code mảng mình chưa cứng nên chưa sử dụng vào bài hơi phức tạp kiêu này được :<

rogp10 viết 12:04 ngày 01/10/2018

Thực ra viết là a[i] cho dễ hình dung thôi.

Nguyễn Hồng Cường viết 12:11 ngày 01/10/2018

Hihi mình cảm ơn,dùng mảng xử lý tốt hơn thiệt <3

Trần Hoàn viết 12:17 ngày 01/10/2018

Tại vì nó chạy hết nửa đầu thì hàm tăng đúng. khi nó sai thì nửa sau lại thành nửa giảm nên (tang() || giam()) luôn đúng

Bài liên quan
0