2016-03-25 17 views
0

Bu tekrarlanabilir, ancak bana güvenin Tatmin edici bir cevap bulamıyorum. Birisi lütfen bana bu sorunun neden yanlış yanıtını alıyorum söyle: https://projecteuler.net/problem=8. Brüt zorla kullandım. Kodum küçük sayılar için doğru cevap veriyor. Ancak 13 haneli yanlış cevap veriyor. Kod:Proje euler üzerinde yanlış cevap alma # 8

#include <iostream> 
#include<string> 
#include<cmath> 
using namespace std; 

int main() 
{ 
    string str = "73167176531330624919225119674426574742355349194934969835203127745063262395783180169848018694788518438586156078911294949545950173795833195285320880551112540698747158523863050715693290963295227443043557 66896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450"; 
    int len = str.size(); 
    double maxi = 0, product = 1; 
    for(int i = 0; i < len - 13; i ++){ 
     product = (str[i] - '0') * (str[i+1] - '0') * (str[i+2] - '0') * (str[i+3] - '0') * (str[i+4] - '0') * (str[i+5] - '0')* (str[i+6] - '0') * (str[i+7] - '0') * (str[i+8] - '0') * (str[i+9] - '0') * (str[i+10] - '0') * (str[i+11] - '0') * (str[i+12] - '0'); 
     if(maxi < product){ 
      maxi = product; 
     } 
    } 
    cout << maxi; 
    cin.get(); 
    return 0; 
} 

Verdikleri örnek için. Ben aynı doğru cevabı 5832. Kod olsun, 4-ardışık basamak ürünüdür:

#include <iostream> 
#include<string> 
#include<cmath> 
using namespace std; 

int main() 
{ 
    string str = "73167176531330624919225119674426574742355349194934969835203127745063262395783180169848018694788518438586156078911294949545950173795833195285320880551112540698747158523863050715693290963295227443043557 66896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450"; 
    int len = str.size(); 
    double maxi = 0, product = 1; 
    for(int i = 0; i < len - 13; i ++){ 
     product = (str[i] - '0') * (str[i+1] - '0') * (str[i+2] - '0') * (str[i+3] - '0'); //* (str[i+4] - '0') * (str[i+5] - '0')* (str[i+6] - '0') * (str[i+7] - '0') * (str[i+8] - '0') * (str[i+9] - '0') * (str[i+10] - '0') * (str[i+11] - '0') * (str[i+12] - '0'); 
     if(maxi < product){ 
      maxi = product; 
     } 
    } 
    cout << maxi; 
    cin.get(); 
    return 0; 
} 
+2

Neden "ürün" hesaplaması için bir döngü kullanmıyorsunuz? –

+2

Hangi noktada beklenen sonuçlara tam olarak ulaşmıyorsunuz? Bir ikili değerin kaç tane doğru basamak gösterebileceğini biliyor musunuz? –

+0

Lütfen sorun bildirimini buraya da yazınız. –

cevap

0

Böyle bir sorunla karşılaştığınızda her seferinde, bir örnek ama yanlış biri için doğru sonuçlar elde nereye taşma hakkında düşünmeniz gereken büyük veri kümesi. product ve maxi, double türündendir. Onları long long olarak değiştirdim ve doğru sonucu aldım. Kodunu da biraz temizledim. İşte

#include <iostream> 
#include<string> 
#include<cmath> 
using namespace std; 

int main() 
{ 
    string str = "73167176531330624919225119674426574742355349194934" \ 
       "96983520312774506326239578318016984801869478851843" \ 
       "85861560789112949495459501737958331952853208805511" \ 
       "12540698747158523863050715693290963295227443043557" \ 
       "66896648950445244523161731856403098711121722383113" \ 
       "62229893423380308135336276614282806444486645238749" \ 
       "30358907296290491560440772390713810515859307960866" \ 
       "70172427121883998797908792274921901699720888093776" \ 
       "65727333001053367881220235421809751254540594752243" \ 
       "52584907711670556013604839586446706324415722155397" \ 
       "53697817977846174064955149290862569321978468622482" \ 
       "83972241375657056057490261407972968652414535100474" \ 
       "82166370484403199890008895243450658541227588666881" \ 
       "16427171479924442928230863465674813919123162824586" \ 
       "17866458359124566529476545682848912883142607690042" \ 
       "24219022671055626321111109370544217506941658960408" \ 
       "07198403850962455444362981230987879927244284909188" \ 
       "84580156166097919133875499200524063689912560717606" \ 
       "05886116467109405077541002256983155200055935729725" \ 
       "71636269561882670428252483600823257530420752963450"; 

    const size_t adjacent = 13; 
    size_t len = str.size(); 

    long long max = 0, product = 1; 
    for(size_t i = 0; i+adjacent < len; ++i) { 
     product = 1; 
     for (size_t j = 0; j < adjacent; ++j) 
      product *= str[i+j] - '0'; 
     if (max < product) 
      max = product; 
    } 
    cout << max << endl; 
    return 0; 
} 

Demo

+0

'std :: accumulate' ve' std :: max' kullanma: http://ideone.com/AhCxP7 – PaulMcKenzie

+0

çok daha iyi! – Maikel

+0

Çok teşekkürler! @Maikel –

1

en olası nedeni oluyor bir tamsayı taşması olmasıdır gider.
13 basamaklı ürünün maksimum değeri 9^13 ve double doğru olarak destekleyemez.

Çözüm, double yerine long long kullanmaktır.

+0

Tamam. Teşekkürler @Anmol. –

+0

Yardım etmek için mutlu @AkhileshChobey! Sorunu çözdüyse, o zaman cevabı kabul etmenizi (ve cevaplamanızı) ve soruyu kapatmanızı rica ediyorum. –

İlgili konular