Pomoc z kodem, operacje na ciągach liczb

0

A jeszcze jedno mnie gnębi.
Chciałbym by program wypisał ostatni wynik z tego zakresu -tylko i wyłącznie ostatni, mój kod:
(chciałbym wjąć zmienną an poza pętlę)

for(int i = 0, an = a0; an <= zakres ; i++)
{
an += x[i%XSIZE];
std::cout<<an<<"\n";
}

0
std::cout<<an<<"\n";

Nie wystarczy wyrzucić tego tuż poza pętlę for?

0

Chciałbym też po każdej pętli wyciągnąć wartość an do dalszych działań jak to zrobić?
Chodzi mi o to by z pętli się odwołać do innego modułu i wrócić z powrotem do pętli z tamtego modułu po dokonaniu kolejnych obliczeń.

1

Możesz to zrobić w pętli używając funkcji albo w moim rozwiązaniu tutaj masz te wartości w tablicy, wtedy możesz przelecieć przez tą tablicę pętlą i robić obliczenia już po wygenerowaniu całego ciągu.

0
atmal napisał(a):

Możesz to zrobić w pętli używając funkcji albo w moim rozwiązaniu tutaj masz te wartości w tablicy, wtedy możesz przelecieć przez tą tablicę pętlą i robić obliczenia już po wygenerowaniu całego ciągu.

Jaki popełniam błąd? Wypisuje wszystkie a nie te co się nie dzielą w dodatku wypisuje 2 razy (czemu else wykonuje się 2 razy?

const int XSIZE = 3;
int x[XSIZE] = {2, 3, 7};
int as = 3;
bool isPrime = true;

for(int i=0, an=as; an<=zakres; i++)

{

    an += x[i%XSIZE];
            
         for(int j=2; j<=as/2; j++)
         {
            
                if(an % j == 0)
                {
                        isPrime = false;
                    
                    
                }
             
          
                else
                {
                    cout << an <<" ";    
                  
              }
        
            
         }
          

}

return 0;

}

1

Zobacz co robisz w tej pętli:

for (int j = 2; j <= as / 2; j++) // Tutaj inkrementacja j dopóki jest mniejsze lub równe as/2
{
	if (an % j == 0) // Tu analizujesz resztę z dzielenia an przez j
	{
		isPrime = false;
	}
	else
	{
		cout << an << " "; // Wypsianie liczby
	}
}

Jako że inkrementujesz j raz będziesz miało wartość 2, potem 3, 4 i tak dalej dopóki nie będzie większe niż as / 2. Raczej nie o to Ci chodzi, szczególnie że wtedy nie będzie Ci poprawnie działał if który miałby napisać czy liczba jest parzysta czy też nie.

0
atmal napisał(a):

Zobacz co robisz w tej pętli:

for (int j = 2; j <= as / 2; j++) // Tutaj inkrementacja j dopóki jest mniejsze lub równe as/2
{
	if (an % j == 0) // Tu analizujesz resztę z dzielenia an przez j
	{
		isPrime = false;
	}
	else
	{
		cout << an << " "; // Wypsianie liczby
	}
}

Jako że inkrementujesz j raz będziesz miało wartość 2, potem 3, 4 i tak dalej dopóki nie będzie większe niż as / 2. Raczej nie o to Ci chodzi, szczególnie że wtedy nie będzie Ci poprawnie działał if który miałby napisać czy liczba jest parzysta czy też nie.

Ehhh. Nie ogarniam tego...
Rozumiem działanie pętli, ale te nie śmigają. Jako wynik dostaję zwielokrotnione liczby, ale wypluwa wszystkie..
Zmienna j najpierw ma sprawdzać liczbę przez 2 potem przez 3 itp, szukam liczb pierwszych w tym wygenerowanym ciągu, przynajmniej staram się.
Instrukcje w tej formie nie spełniają swojego zadania, jakaś podpowiedź? Siedzę już parę h nad tymi instrukcjami i nie mogę zmusić ich do działania :/

Właściwie to dążę po mału do tego by instrukcja wygenerowała liczbę i skoczyła do modułu, który też wg tej samej metody będzie generował liczby w celu testu iloczynu by znaleźć liczby pierwsze z ciągu. Czyli an += x[i%XSIZE] generuje liczbę -skacze do innego modułu, który generuje te same, kolejne liczby ciągu i stara się podzielić.
Oczywiście próbuje dzielić do momentu, aż wygenerowana liczba jest >½ sprawdzanej.
Potem wypluwa wynik i wraca do pętli w celu wygenerowania kolejnej liczby do sprawdzenia. Da się to w miarę prosto ogarnąć? Najlepiej by było oczywiście jakby nową liczbę ciągu testował po prostu dzieląc ją przez już zapisane wyniki na tablicy.

Mój cały kod:
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstdlib>
#include <chrono>
#include <stdio.h>
#include <math.h>
using namespace std;

int main()
{

int zakres;
cout << "Podaj zakres: ";
cin >> zakres;
                                                                        auto start = std::chrono::system_clock::now();

const int XSIZE = 8;
int x[XSIZE] = {2,3,4};
int a0 = 4;
int an=a0;
int  i=0;

for(i=0; an<=zakres; i++)
{

    an += x[i%XSIZE];
            
            //intfile << an << " ";
           //cout<<an<<" ";
        
       
            
         }
    //intfile.close();
                                                                        auto end = std::chrono::system_clock::now();
                                                                chrono::duration<double> elapsed_seconds = end-start;
                                                        time_t end_time = std::chrono::system_clock::to_time_t(end);
                                                    std::cout << "finished computation at " << std::ctime(&end_time)
                                                            << "elapsed time: " << elapsed_seconds.count() << "s\n";

}//main
1

Najprościej dla sprawdzenia czy liczba jest pierwsza zrobić osobną funkcję

bool isPrime(int num)
{
	if (num < 2)
		return false;

	for (int i = 2; i * i <= num; i++)
	{
		if (num % i == 0)
		{
			return false;
		}
	}
	return true;
}

I potem wywołujesz ją w pętli.

Jeżeli potrzebujesz stworzyć kolejną liczbę na podstawie tego samego sposobu co teraz to zacznij od przepisania tego do funkcji.

0
atmal napisał(a):

Najprościej dla sprawdzenia czy liczba jest pierwsza zrobić osobną funkcję

bool isPrime(int num)
{
	if (num < 2)
		return false;

	for (int i = 2; i * i <= num; i++)
	{
		if (num % i == 0)
		{
			return false;
		}
	}
	return true;
}

I potem wywołujesz ją w pętli.

Jeżeli potrzebujesz stworzyć kolejną liczbę na podstawie tego samego sposobu co teraz to zacznij od przepisania tego do funkcji.
Dziękuję za pomoc udało się odpalić.
A da się tak zrobić by funkcja dzieliła tylko przez wyniki z tablicy?

1

Oczywiście że da się.
Zrób pętlę która leci Ci przez tablicę i wywołuję to funkcję przekazując numer z tablicy jako argument.

1 użytkowników online, w tym zalogowanych: 0, gości: 1