2012-12-20 36 views
6

tôi có chương trình đơn giản này:main() không thực hiện, nhưng biên soạn

// Include libraries 

#include <iostream> 
#include <string> 
#include <vector> 

using namespace std; 

// Include locals 

// Start 

#define NUMBER 600851475143 

int main(int argc, const char* argv[]) 
{ 
    long long int ans = 0; 
    long long int num = NUMBER; 

    vector<int> factors; 

    do 
    { 
     // Get lowest factor 

     for (int i = 1; i <= num; ++i) 
     { 
      if (!(num % i)) 
      { 
       factors.push_back(i); 

       num /= i; 
       break; 
      } 
     } 
    } while (num > 1); 

    cout << "Calculated to 1.\n"; 

    int highestFactor = numeric_limits<int>::min(); 

    for (int i = 0; i < factors.size(); ++i) 
    { 
     if (factors[i] > highestFactor) 
     { 
      highestFactor = factors[i]; 
     } 
    } 

    ans = highestFactor; 

    cout << ans << endl; 

    return EXIT_SUCCESS; 
} 

biên soạn với g++ -O2 -c -o prob3.o prob3.cpp chứng minh thành công, nhưng khi tôi chạy nó tôi thấy không có gì và nó chỉ tiếp tục chạy và tôi đã phải Ctrl-C (ép buộc) cuối cùng. Khi tôi cố gắng thêm

int main(int argc, const char* argv[]) 
{ 
    cout << "Test\n"; 

vào chương trình, Test cũng không được in. Nó giống như chương trình của tôi không được thực hiện ở tất cả.

Bất kỳ trợ giúp hoặc lời khuyên nào được đánh giá cao!

Giải pháp

Tôi quên số nguyên tố bắt đầu lúc 2. Thay đổi for (int i = 1 để for (int i = 2.

+1

Bạn có thấy nó đang chạy trong trình quản lý tác vụ/ps không? – amit

+0

Lệnh biên dịch của bạn sẽ không tạo ra tệp thực thi, chỉ là tệp đối tượng. Bạn có một bước liên kết không? –

+5

Hãy thử 'cout <<" Test "<< endl;' 'endl' xóa luồng, một lần (nghĩa là hiếm) là một việc tốt để làm. –

Trả lời

7

Vòng lặp lồng nhau đó sẽ lặp mãi mãi. Vòng lặp bên trong for sẽ chỉ thực hiện một lần vì break vì vậy nó sẽ chỉ bao giờ thực hiện num /= 1. Điều đó có nghĩa là num không bao giờ giảm và vì vậy num > 1 sẽ không bao giờ là sai. Tôi cho rằng bạn chỉ cần chờ lâu hơn!

Lý do bạn không nhìn thấy "Kiểm tra" có thể là do bạn chưa xóa đầu ra. Hãy thử:

std::cout << "Test" << std::endl; 
+0

Ahh, giờ nó đang đỏ bừng. Cảm ơn! Tôi sẽ chỉ cần kiểm tra vòng lặp của tôi ... –

+1

@ihsoyih Tôi đã cập nhật. Nó không chỉ mất một thời gian dài, nó lấy mãi mãi. –

+4

@ihsoyih chỉ thay đổi '1' trong vòng lặp bên trong thành' 2'. –

2

Chương trình của bạn chỉ đơn giản là chạy. Phải mất một thời gian dài để thực hiện.

Đối với cout << "Test\n";, đó là vấn đề của luồng cout không bị xóa: những gì bạn đã viết cho luồng vẫn nằm trong bộ nhớ chương trình của bạn và chưa được flushed vào hệ thống được in.

1

Bạn đã cố gắng bắt đầu điều kiện của mình từ 2? Chức năng mô-đun không có ý nghĩa nếu bắt đầu từ 1.

if (! (Num% i))

Num/1 Cho 0, vì vậy bạn không nhập vào nếu tình trạng

+0

lol, vâng. Vấn đề toán học. –

0

Vòng lặp của bạn là một vòng lặp vô hạn. Yếu tố đầu tiên bạn tìm thấy là 1 (kể từ num % 10) và như vậy bạn chia num theo số 1 kết quả trong num quay lại vòng lặp for, lặp lại lặp lại.

Cũng với điều này cố định (khởi tạo i trong vòng lặp với 2), vòng lặp bên trong của bạn rất có thể là vòng lặp vô hạn và/hoặc gây ra UB. Nếu không (như những người khác đã nói) nó là "chỉ" chạy rất dài. Đối với trường hợp nó khác (giả sử hầu hết các nền tảng phổ biến ở đây). Điều này phụ thuộc vào giá trị bạn đang cố gắng tính, nếu hệ số đầu tiên nhỏ hơn std::numeric_limits<int>::max() thì điều này không áp dụng. Cho phép gọi những số nguyên tố BIGPRIME (600851475149 sẽ là một ví dụ tốt).

long long int có kích thước ít nhất 64bit.int không thể lớn hơn 32 bit trên hầu hết nền tảng, do đó, khi nó không lớn hơn trên nền tảng của bạn, nó chỉ có thể lên tới std::numeric_limits<int>::max() (một lần nữa giả định nền tảng 32 bit phổ biến tại đây) 2147483647. nhưng giữ giá trị của nó, luôn nhỏ hơn BIGPRIME. Luôn luôn tăng i không bao giờ nhận được bất cứ nơi nào, và một khi bạn đang ở max() bạn nhập UB đất như số nguyên đã ký không bọc trong C + +. Mã của bạn có thể có vòng lặp vô hạn ở đó hoặc làm một số việc như ghi -1 làm yếu tố hợp lệ hoặc khiến bạn mang thai.

Bạn có thể dễ dàng nhận thấy rằng bằng cách thêm một số

if(0 == (i%100000000)){ std::cout << i << std::endl; } 

vào for vòng lặp.

Các vấn đề liên quan