Hỗ trợ lập trình Java
Hãy đăng nhập để tham gia thảo luận và chia sẻ!
Hỗ trợ lập trình Java
Hãy đăng nhập để tham gia thảo luận và chia sẻ!
Hỗ trợ lập trình Java

Diễn đàn hỏi đáp Java, hướng dẫn bài tập Java, Giúp đỡ về Java


You are not connected. Please login or register

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down  Thông điệp [Trang 1 trong tổng số 1 trang]

1lỗi bị stop woking Empty lỗi bị stop woking Tue Mar 12, 2013 6:03 pm

1101817


Vịt mới lớn
Vịt mới lớn
mấy a quản trị cho e hỏi e lỗi chổ nào mà nó bị stop working.đề bài là nhập vào 2 số a và b tìm xem giữa 2 số đó có bao nhiêu số Fibonacci.ví dụ nhập a=1234567890 và b=9876543210..

#include <conio.h>
#include <stdio.h>

unsigned long long fi(unsigned long long n)
{
unsigned long long *A= new unsigned long long[n+1];
A[0] = A[1] = 1;
unsigned long long i=2;
while(i<=n){
A[i] = A[i-1] + A[i-2];
i++;
}
unsigned long long kq = A[n];
delete []A;
return kq;
}
int main(){
unsigned long long a,b;
unsigned long long dem=0;
printf("\nNhap a,b:");
scanf("%I64d%I64d",&a,&b);
unsigned long long i=0;
while(i<=a)
{
if(fi(i)>=a && fi(i)<=b)
dem++;
i++;
}
printf(" so luong = %I64d",dem);
getch();
}

2lỗi bị stop woking Empty lỗi về thuật toán Wed Mar 13, 2013 8:59 pm

Võ Nguyên Khoa


Vịt con
Vịt con
Bài của bạn có lẽ sai về thuật toán.
Thứ 1: Theo tôi hiểu thì chương trình bạn chạy vòng lập từ i=0 --> a ( O(a) ) để gọi hàm fi(i) ( O(i) ) rồi tính số lượng số fibonacci.
Vậy nếu a = 1000000000 --> chương trình bạn chạy với đọ phức tạp khoảng O(1000000000^2).
Nên không chạy ra được.
Thứ 2: là thuật toán xét số của bạn như thế cũng chưa hợp lý. Bạn phải tím số fi() từ a --> b chứ không phải là bé hơn a và b.

Mình có viết 1 đoạn để giải quyết vấn đề của bạn. Thuật toán như sau:

+ Đầu tiên là: nhận vào 2 số a,b từ bàn phím
+ Bước 2: chạy từ 0 -- > b ( trường hợp b > a, nếu nhỏ hơn thì swap(a,b) ) để xét những số nào là finacci thì đưa vào 1 vector
+ Bước 3: Chạy từ 0 --> cuối vector bạn đã có, xét số fi nào lớn nhất <= a thì xem đó là giá trị móc 1, và số fi lớn nhất nào > a mà <= b thì xem đó là giá trị móc 2
+ Bước 4: lấy khoảng các giữa giá trị móc 1 và móc 2.

Source:
Code:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

// Khai bao mang de chua cac gia tri fibonacci sieve duoc

vector<unsigned long long> vectorForSieve;

// Tao ham de gang gia tri cho mang khi tien hanh sieve
// Ham nay chi chay 1 lan

void sieveProcess(unsigned long long n) {
   
    unsigned long long i = 2;

// Gang 2 phan tu dau tien gia tri la 1 (fi(0) = fi(1) = 1)
   
    vectorForSieve.push_back(1);
    vectorForSieve.push_back(1);
   
// Sang cho cac phan tu tiep theo den ---> n
   
    unsigned long long bufForMyVector = 0;
    while(true) {
           
        bufForMyVector= vectorForSieve[i-1] + vectorForSieve[i-2];
        vectorForSieve.push_back(bufForMyVector);
        if(vectorForSieve[i] >= n) break;
        i++;
    }
}

int main() {

    unsigned long long a,b;
    printf("Nhap vao a, b: ");
    scanf("%I64d%I64d",&a,&b);

// Swap neu a > b

    if(a > b) swap(a,b);
   
// Chay ham sieveProcess de sieve tu 0 --> b (trong truong hop b la so lon)
   
    sieveProcess(b);

    int i = 0;
    int countOfA = 0;
    int countOfB = 0;
    while (vectorForSieve[i] <= b) {
       
        if(vectorForSieve[i] <= a) countOfA = i;
        if(vectorForSieve[i] <= b) countOfB = i;
        i++;
    }
   
    int result = abs(countOfB - countOfA); 
    printf("Ket qua la: %d\n",result);   

    getch();
    return 0;
}

Vì trình độ có hạn, nên chỉ dừng lại ở mức độ giải quyết vấn đề. Bạn háy tham khảo thêm những thuật toán nâng cao. Hy vọng giúp được bạn. Chào bạn.

http://mrkhoa.web44.net

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang  Thông điệp [Trang 1 trong tổng số 1 trang]

Permissions in this forum:
Bạn không có quyền trả lời bài viết