2012-12-20 10 views
6

मैं इस साधारण प्रोग्राम है:मुख्य() को क्रियान्वित नहीं है, लेकिन संकलन

// 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; 
} 

g++ -O2 -c -o prob3.o prob3.cpp साथ संकलन सफल साबित हुई, लेकिन जब मैं यह भाग गया मैं कुछ भी नहीं देखा था और यह सिर्फ चल रहा रखा और मैं Ctrl-C करना पड़ा (बल-हत्या) अंत में। जब मैं कार्यक्रम के लिए

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

जोड़ने की कोशिश, Test भी मुद्रित नहीं जा सके थे। ऐसा लगता है कि मेरे कार्यक्रम को बिल्कुल निष्पादित नहीं किया गया है।

कोई भी मदद या सलाह की सराहना की जाती है!

समाधान

मैं रूढ़ अंक भूल for (int i = 2 2. बदलें for (int i = 1 पर शुरू कर दिया।

+1

क्या आप इसे अपने टास्क मैनेजर/ps में चलाने के रूप में देखते हैं? – amit

+0

आपका संकलन आदेश निष्पादन योग्य नहीं होगा, केवल एक ऑब्जेक्ट फ़ाइल। क्या आपके पास एक लिंक कदम भी है? –

+5

'cout << "टेस्ट" << endl; '' endl' स्ट्रीम को स्ट्रीम करें, जो एक बार (यानी, यह दुर्लभ है) करने की कोशिश करना एक अच्छी बात है। –

उत्तर

7

उन नेस्टेड लूप हमेशा के लिए लूप जा रहे हैं। आंतरिक for लूप केवल break की वजह से कभी-कभी निष्पादित होगा, इसलिए यह केवल num /= 1 करेगा। इसका मतलब है कि num कभी घटता नहीं है और इसलिए num > 1 कभी झूठा नहीं होगा। मुझे लगता है कि आपको बस इंतजार करना होगा!

कारण आप "टेस्ट" नहीं देख रहे हैं शायद इसलिए कि आपने आउटपुट को फ्लश नहीं किया है। आज़माएं:

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

आह, यह अब फ्लशिंग है। धन्यवाद! मुझे बस अपना लूप जांचना होगा ... –

+1

@ihsoyih मैंने अपडेट किया। यह सिर्फ एक लंबा समय नहीं ले रहा है, यह हमेशा के लिए ले रहा है। –

+4

@ihsoyih बस आंतरिक लूप में '1' को '1'' में बदलें। –

2

आपका प्रोग्राम बस चल रहा है। निष्पादित करने में लंबा समय लगता है।

cout << "Test\n"; के लिए, यह cout स्ट्रीम का मामला नहीं है, जो स्ट्रीम में लिखा गया है: स्ट्रीम में जो भी लिखा गया है वह अभी भी आपकी प्रोग्राम मेमोरी में है और अभी तक मुद्रित होने के लिए सिस्टम में नहीं पहुंचा है।

1

क्या आपने 2 से शर्त के लिए अपनी शुरुआत करने की कोशिश की है? मॉड्यूल समारोह भावना नहीं है, तो शुरू से ही 1.

if (! (संख्या% i))

अंक/1 दे 0, ताकि आप अगर हालत में प्रवेश नहीं कर रहे हैं

+0

लॉल, हाँ। गणित की समस्या। –

0

आपका लूप एक अनंत लूप है। आपको लगता है कि पहला कारक 1 है (num % 10 है) और इस तरह आप num1 से विभाजित करते हैं जिसके परिणामस्वरूप num होता है जो लूप के लिए फिर से प्रवेश करता है, जो बार-बार करता है।

इसके साथ ही 2 के साथ लूप में i प्रारंभ करें), आपके आंतरिक लूप के लिए एक अनंत लूप और/या यूबी का कारण बनता है। अन्यथा (जैसे अन्य ने कहा) यह "बस" बहुत लंबा चल रहा है। जिस मामले में यह अलग है (यहां सबसे आम प्लेटफॉर्म मानते हैं)। यह उस मूल्य पर निर्भर करता है जिसे आप कारक करने की कोशिश कर रहे हैं, यदि पहला कारक std::numeric_limits<int>::max() से छोटा है तो यह लागू नहीं होता है। आइए उन प्राइम्स को कॉल करें BIGPRIME (600851475149 एक अच्छा उदाहरण होगा)।

long long int आकार में कम से कम 64 बिट है।अधिकांश प्लेटफ़ॉर्म पर int 32 बिट से बड़ा होने की संभावना नहीं है, इसलिए जब यह आपके प्लेटफ़ॉर्म पर बड़ा नहीं होता है तो यह केवल std::numeric_limits<int>::max() तक जा सकता है जो कि (यहां सामान्य 32 बिट प्लेटफॉर्म को फिर से मानते हैं) 2147483647 जो बदले में long long int की तुलना में प्रचारित है लेकिन इसका मान रखता है, जो हमेशा BIGPRIME से छोटा होता है। हमेशा i बढ़ाना कभी भी नहीं मिलता है, और एक बार जब आप max() पर जाते हैं तो आप यूबी भूमि दर्ज करते हैं क्योंकि हस्ताक्षरित पूर्णांक C++ में लपेटते नहीं हैं। आपका कोड अनंत लूप हो सकता है, या -1 को वैध कारक के रूप में रिकॉर्ड करने जैसी कुछ चीजें करें, या आपको गर्भवती बना दें।

आप आसानी से for लूप में कुछ

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

जोड़कर देख सकते हैं कि।

संबंधित मुद्दे