Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C++: Neliöjono (paranneltu)

JRokka [15.03.2020 17:25:54]

#

#include <iostream>
using namespace std;

int main(){
 int luvut[] = {1,5,4,8,64,4096,1,1,1,390625};
 int alku = 0;
 int loppu = 0;
 int indeksi = 0;
 bool onko = false;
 bool onko_2 = false;
 for (int x = 0; x < 10; x++){
  //Oletetaan, että on neliöjono kunnes toisin todistetaan.
  //Neliöjonon tulee olla mahdollisimman pitkä.
  //Neliöjonossa seuraava luku on edellisen neliö.
  int y = x+1;
  onko = true;
  onko_2 = false;
  while (y < 10 && onko == true){
   if (luvut[y] != luvut[y-1]*luvut[y-1]){
     onko = false;
   }
   else {
     //Tallennetaan tiedot.
     onko_2 = true;
     alku = x;
     loppu = y;
     indeksi = y;
   }
   y++;
  }
  if (onko_2 == true){
   //Tulostetaan neliöjono.
   for (int y = alku; y <= loppu; y++){
     cout << luvut[y] << endl;
   }
   x = indeksi;
   cout << "" << endl;
  }

 }

 return 0;
}

Metabolix [17.03.2020 14:09:59]

#

Sinun on nyt oikeasti opeteltava eroon noista while-onko-viritelmistä. Varsinkin muuttujan nimi ”onko” on aivan pöljä. Onko mitä? Laitan viestin lähetykseen filtterin tätä ongelmaa vastaan.

Tässä on vielä kerran pari vaihtoehtoa.

Ensinnäkin lukujen määrä olisi hyvä nimetä; maaginen 10 koodissa on epäselvä.

const int luvut[] = {2, 4, 16, 256, 3, 5, 25, 125, 7, 49};
const int lukuja = sizeof(luvut) / sizeof(luvut[0]);

Lyhyt versio:

for (int a = 0, b; a < lukuja; a = b) {
  for (b = a + 1; b < lukuja && luvut[b] == luvut[b-1] * luvut[b-1]; ++b);
  if (b - a > 1) {
    std::cout << luvut[a++];
    while (a < b) {
      std::cout << ", " << luvut[a++];
    }
    std::cout << std::endl;
  }
}

Haku- ja tulostussilmukat voi myös yhdistää:

for (int a = 0, b; a < lukuja; a = b) {
  bool tulostettu = false;
  for (b = a + 1; b < lukuja && luvut[b] == luvut[b-1] * luvut[b-1]; ++b) {
    if (b == a + 1) {
      std::cout << luvut[a];
    }
    std::cout << ", " << luvut[b];
    tulostettu = true;
  }
  if (tulostettu) {
    std::cout << std::endl;
  }
}

Viimeisenkin silmukan voi yhdistää:

for (int i = 1, jonossa = 0; i < lukuja; ++i) {
  bool jono_loppuu = i == lukuja - 1;
  if (luvut[i] != luvut[i-1] * luvut[i-1]) {
    jono_loppuu = true;
  } else {
    if (jonossa == 0) {
      jonossa = 1;
      std::cout << luvut[i-1];
    }
    jonossa += 1;
    std::cout << ", " << luvut[i];
  }
  if (jonossa && jono_loppuu) {
    jonossa = 0;
    std::cout << std::endl;
  }
}

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta