2016-11-22 4 views
0

Ich möchte eine Funktion haben, die die Summe der verschiedenen (nicht duplizierten) Werte aus einem Array zurückgibt: Wenn ich {3, 3, 1, 5} habe, möchte ich Summe von 3 + 1 + 5 = 9 haben.Summe verschiedener Zahlen in einem Array

Mein Versuch war:

int sumdiff(int* t, int size){ 
    int sum=0; 
    for (int i=0; i<=size;i++){ 
     for(int j=i; j<=size;j++){ 
      if(t[i]!=t[j]) 
      sum=sum+t[i]; 
     } 
    } 
    return sum; 
} 

int main() 
{ 
    int t[4]={3, 3, 1, 5}; 
    cout << sumdiff(t, 4); 
} 

Es gibt 25 und ich glaube, ich weiß, warum, aber ich weiß nicht, wie es zu verbessern. Was soll ich ändern?

+0

Bitte erläutern Sie Ihre „Warum“ (Sie sagten, Sie denken, Sie wissen, warum es nicht funktioniert) in Frage. Formatieren Sie Ihren Code außerdem, um besser lesbar zu sein. – Tom

+0

(1) Sie verlassen die Grenzen des Arrays; (2) Sie vergleichen den Index, aber nicht den Wert des Elements für die Duplizierungsprüfung. – songyuanyao

+0

Sie haben undefiniertes Verhalten, Out-of-bounds-Zugriff des Arrays – Rakete1111

Antwort

1

Zunächst einmal zu berechnen, sollten Sie Ihre Schleife for (int i=0; i<size;i++) sein. Ihr tatsächlicher Code greift außerhalb der Grenzen des Arrays zu.

Dann, wenn Sie nicht STL-Container und Algorithmen verwenden wollen (aber Sie sollten), können Sie Ihren Code wie folgt ändern:

int sumdiff(int* t, int size){ 
    int sum=0; 
    for (int i=0; i<size;i++){ 

     // check if the value was previously added 

     bool should_sum = true; 

     for(int j=0; should_sum && j<i;j++){ 
      if(t[i]==t[j]) 
       should_sum = false; 
     } 

     if(should_sum) 
      sum=sum+t[i]; 
    } 
    return sum; 
} 

int main() 
{ 
    int t[4]={3, 3, 1, 5}; 
    cout << sumdiff(t, 4); 
} 
+0

Eine weitere Frage warum j Mroweczka

+0

Bis zum Element ** vor ** Element am Index 'i' gehen – wasthishelpful

+0

vielen Dank! – Mroweczka

2

Legen Sie alle Elemente in ein Set und zählen Sie sie dann.

Sets sind Datenstrukturen, die nur ein Element jedes Werts enthalten (d. H. Jedes ihrer Elemente ist eindeutig; wenn Sie versuchen, denselben Wert mehrmals hinzuzufügen, wird nur eine Instanz gezählt).

Sie können einen Blick in this interesting question über die eleganteste Art, dies für Ints tun.

+1

Vielleicht erweitern Sie Ihre Antwort ein wenig? – Rakete1111

+0

Ich würde mich freuen. – Mroweczka

+0

Wow, das war super schnell, Mike :) –

0

Sie könnten:

  • Speichern Sie Ihre Array-Inhalt in eine std::unordered_set erste. Auf diese Weise würden Sie die Duplikate automatisch entfernen.
  • Dann std::accumulate nennen die Summe
  • 0

    ** wasthishelpful Antwort war genau das, was ich sprach, . Ich habe seinen Post gesehen, nachdem ich meinen gepostet habe.

    Sie versuchen also, die doppelte Nummer mit Ihrer inneren Schleife zu überprüfen. Ihre äußere Schleife wird jedoch viermal wiederholt, unabhängig davon, was zu einem falschen Ergebnis führt. Versuchen Sie,

    • Überprüfen Sie nur innere Schleife. (Verwenden Sie ein Flag zum Aufzeichnen, wenn falsch)
    • Tun Sie Ihre Summe außerhalb der inneren Schleife. (Tun, um die Summe, wenn Flag wahr ist)
    0

    Insert Array-Elemente in einem Satz verwenden std::accumulate Funktion:

    #include <iostream> 
    #include <numeric> 
    #include <set> 
    
    int main() 
    { 
        int t[4] = { 3, 3, 1, 5 }; 
        std::set<int> mySet(std::begin(t), std::end(t)); 
        int mySum = std::accumulate(mySet.begin(), mySet.end(), 0); 
        std::cout << "The sum is: " << mySum << std::endl; 
        return 0; 
    } 
    
    0

    Hier ist eine andere Lösung std::accumulate verwenden, aber es iteriert die ursprünglichen Elemente in der Über nennen std::accumulate, und baut die Menge und hält eine laufende Summe als jede Zahl in dem Feld angetroffen wird:

    #include <iostream> 
    #include <numeric> 
    #include <set> 
    
    int main() 
    { 
        int t[4] = { 3, 3, 1, 5 }; 
        std::set<int> mySet; 
        int mySum = std::accumulate(std::begin(t), std::end(t), 0, 
         [&](int n, int n2){return n += mySet.insert(n2).second?n2:0;}); 
        std::cout << "The sum is: " << mySum << std::endl; 
        return 0; 
    } 
    

    Das System funktioniert so, dass std::insert() gibt eine pair tbat zurück bestimmt, ob das Element eingefügt wurde. Die second des Paares ist eine bool, die angibt, ob der Artikel in den Satz eingefügt wurde. Wir addieren nur zu der Summe, wenn die Einfügung erfolgreich ist, andernfalls fügen wir 0 hinzu.

    Live Example

    +0

    'const std :: gesetzt mySet {std :: begin (t), std :: end (t)}; const int mySum = std :: akkumulieren (std :: begin (t), std :: end (t), 0); 'scheint natürlicher/einfacher. – Jarod42

    Verwandte Themen