Wie rechne ich im Arduino alle geraden Zahlen von -50 bis 25 zusammen

Ich bin beim üben für meine Prüfung am verzwifeln, ich weiss nicht wie man zb. von -50 bis 25 alle geraden Zahlen zusammen rechnet

Wäre froh wenn jemand einen Beispielcode hätte
Anfäger :slight_smile:

Probiers mal mit einer for Schleife.

Wodurch ist eine gerade Zahl definiert?

Gruß Tommy

const int startZahl = -50;
const int stopZahl = 25;
unsigned int anzahlZahl;
int summeZahl;
unsigned int summeAbsZahl;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  int beginZahl = min(startZahl, stopZahl);
  int endZahl = max(startZahl, stopZahl);
  for (int i = beginZahl; i <= endZahl; i++)
  {
    anzahlZahl++;
    summeZahl += i;
    summeAbsZahl += abs(i);
    Serial.println(i);
  }
  Serial.print(F("Durchläufe: "));
  Serial.println(anzahlZahl);
  Serial.print(F("Summe Ganzzahl: "));
  Serial.println(summeZahl);
  Serial.print(F("Summe Werte: "));
  Serial.println(summeAbsZahl);
}

void loop()
{
}

-494

Genau die entscheidende Information fehlt vom TO:

Summe der Zahlen oder Summe der Absolutwerte.

@my_xy_projekt: nur die geraden Zahlen.

Gruß Tommy

??? - wie kommst Du da drauf? den zieh ich zurück - Siehe @Tommy56
Wenn denn 42.

1 Like

Ach ja ... na denne...

const float startZahl = -50.1;
const float stopZahl = 25.9;
unsigned int anzahlZahl;
int summeZahl;
unsigned int summeAbsZahl;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  int beginZahl = min(startZahl, stopZahl);
  int endZahl = max(startZahl, stopZahl);
  for (int i = beginZahl; i <= endZahl; i++)
  {
    if (i % 2 == 0)
    {
      anzahlZahl++;
      summeZahl += i;
      summeAbsZahl += abs(i);
      Serial.println(i);
    }
  }
  Serial.print(F("Durchläufe: "));
  Serial.println(anzahlZahl);
  Serial.print(F("Summe Ganzzahl: "));
  Serial.println(summeZahl);
  Serial.print(F("Summe Werte: "));
  Serial.println(summeAbsZahl);
}

void loop()
{
}

Und solltest die Durchläufe in Gänze wollen, dann gehört das aus der if Abfrage raus und davor gesetzt.

Du kannst dir die Zahlen von - 25 bis 25 sparen, die heben sich in der Summe zu 0 auf. Der Rest muss negativ sein, deswegen kannst du auch die positive Summe bis 50 rechnen, davon die bis 25 abziehen und negativ setzen. Für die Summe der ersten n Zahlen bzw. geraden Zahlen gibt es einfache Formeln - googlen findet die schnell.

Unter der Annahme, dass die beginZahl gerade ist (wie z.B. -50), kann man das ohne Modulo lösen:

for (int i = beginZahl; i <= endZahl; i+=2)
{

:wink:

1 Like

Hallo
dadurch das kein Bogen drin ist , ist doch klar, damit bleibt nur 1, 11 usw. übrig
duck und weg

Gruß Heinz

1 Like

Ist bei einer gerade Zahl das erste Bit (ganz Rechts) nicht immer 0?

Dann könnte man aufs Modulo verzichten und einfach das Bit auslesen. Weis aber nicht, ob das Leistung/Speicher spart.

1 Like

Man kann die Annahme auch auflösen und garantieren :wink:
Einfach vor der Schleife aufaddieren:

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  int beginZahl = min(startZahl, stopZahl);
  int endZahl = max(startZahl, stopZahl);
  while (beginZahl % 2 != 0)
    beginZahl++;
  for (int i = beginZahl; i <= endZahl; i += 2)
  {
    anzahlZahl++;
    summeZahl += i;
    summeAbsZahl += abs(i);
    Serial.println(i);
  }
  Serial.print(F("Durchläufe: "));
  Serial.println(anzahlZahl);
  Serial.print(F("Summe Geradezahl: "));
  Serial.println(summeZahl);
  Serial.print(F("Summe Werte: "));
  Serial.println(summeAbsZahl);
}

Also wenn ich das while() aus meinem oben durch

  if (bitRead(beginZahl,0))
    bitSet(beginZahl,0);

ersetze, macht das Speichermäßig keine Änderung.
Aber nette Idee :wink:

Dann werden aber die ungeraden Zahlen aufaddiert.
bitClear() wäre besser aber auch nicht richtig, fängt dann zu früh an. Mit ++ liegt man auf der sicheren Seite. Oder ganz einfach:
beginZahl += odd(beginZahl);

Man kann das ganze doch auch negieren, oder?

Das war auch meine UrFassung, die ich aus einem nicht mehr bekannten Empfinden noch geändert hatte... :wink:

Da wird dann eine ungerade Zahl draus.

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  for (int i = 1; i<10; i++)
  {
    Serial.print(i); Serial.print(" ");
    int tikZahl = i;
    if (!bitRead(tikZahl, 0))
      bitSet(tikZahl, 0);
    Serial.println(tikZahl);
  }
}

Ergebnis:

11:53:43.208 -> Start...
11:53:43.208 -> 1 1
11:53:43.208 -> 2 3
11:53:43.208 -> 3 3
11:53:43.208 -> 4 5
11:53:43.208 -> 5 5
11:53:43.208 -> 6 7
11:53:43.208 -> 7 7
11:53:43.208 -> 8 9
11:53:43.241 -> 9 9

Ich glaub wir reden aneinander vorbei. Ich meinte eigentlich aus Post #8 das Modulo einfach durch bitRead ersetzen :upside_down_face:

Ist gar nicht so einfach von Handy aus :sweat_smile:

if (!(i&1))

2 Likes

Stimmt. i&1liefert 1, wenn das rechte Bit gesetzt ist, also die Zahl ungerade ist.