Problem ze znalezieniem najmniejszej wielokrotności liczby n

0

mam do zrobienia takie zadanie: znajdz najmniejsza wielokrotnosc liczby n, ktora jest kwadratem liczby naturalnej

#include <iostream>
#include <cstdlib>
#include <math.h>

using namespace std;

int main
{
    int a
    cout << "Podaj liczbe n: "   
    cin >> n
    pow (double b)

    for (int i = 0; i <100; i++)
    {
        tab[i] = n*i
    }

    if( pow (double b) == c == n*i)
        cout<<c

    system("PAUSE");
    return 0;
}

moglibyscie mi powiedziec co jest zle?

0

Właściwie wszystko. Używasz zmiennych których nie deklarujesz. Próbujesz deklarować funkcje w funkcji. Ogólnie WTF. O bzdurach typu brak średnika nawet nie mówie, bo to szczegół.
Nie wiem czym u ciebie jest tablica "tab" i co niby ma przechowywać. Nie wiem też czemu twój "if" nie jest wewnątrz pętli for() chociaż powinien. Nie rozumiem czym u ciebie jest "b" na którym próbujesz wywołać pow() (przy okazji, nie podaje się typu argumentu przy wywołaniu funkcji...). Nie wiadomo też czym jest 'c'.

0

to jest tak pisane na szybko, trzy tygodniu nie bylo mnie na lekcjach i nie ogarniam o co chodzi z tym cpp, moglibyscie mi polecic jakies strony albo lektury o tym?

0

Nie masz czasem tego zadania z http://potyczki.mimuw.edu.pl/user.php?op=zadania? Coś znajomo wygląda. Co jest źle? W zasadzie wszystko.

0

@xdziekan symfonia C++ standard :)

0

Albo coś darmowego:
Co prawda pisane pod kątem gamedev'u ale podstawy są opisane porządnie, przystępnie i obszernie.
http://xion.org.pl/download/7/

0

Ciężko zmienić coś w twoim kodzie bo nie do końca wiadomo jak byś chciał to zrobić. Nie mam teraz kompilatora pod ręką ale proponowałbym coś w stylu

#include <iostream>
#include <math.h>

using namespace std;

int main(){

int n;
cin >> n;
int value = n; // kopia wartosci n

while(true){ // wykonuj w nieskonczonosc

	int square = sqrt(n); // pierwiastek zostanie zaokrąglony do liczby calkowitej
	if(square*square == n){ // jesli podniesiony do kwadratu da nam n to znaczy ze byl calkowity
	cout << n << endl; //wypisz n
	break; //przerwij petle
	}
	n += value; // to samo co n = n + value; czyli przechodzimy do kolejnej wielokrotnosci n 
}

return 0;
}
0

Oto częściowo zatwierdzona przez PA wersja, i tak już po terminie wiec chyba problemu nie będzie

#include <iostream>
#include <math.h>

using namespace std;

int main()
{
    long long int liczba = 0;
    double pierw=0;
    cin >> liczba;
    long long int wynik = liczba + liczba;
    pierw = sqrt(wynik);
    while (pierw != int(pierw))
    {
        wynik = wynik + liczba;
        pierw = sqrt(wynik);

    }
    cout << wynik;

}
0
sig napisał(a):

Oto zatwierdzona przez PA wersja, i tak już po terminie wiec chyba problemu nie będzie
Ta zatwierdzona wersja daje kompletny chrzan dla liczb blizkich górnej granicy 500mln - którą widać w zadaniu.

  1. Mój pomysł z rozkładem na liczby pierwsze był słuszny (dla dużych liczb) nie chce mi się tego sprawdzać dla małych zakresów.
#include <iostream>
#include <iomanip>
#include <list>
#include <set>
#include <cmath>
using namespace std;

class Primes
  { 
   private:
   list<long long> List;
   struct Data
     {
      long long V;
      list<long long>::iterator it; 
      Data(long long V,list<long long>::iterator it):V(V),it(it) {}
      bool operator<(const Data &D)const { return V<D.V; }
     };
   multiset<Data> Set;
   long long N;
   public:
   Primes():N(2) {}
   long long next();
  };

long long Primes::next()
  {
   long long Ret=N;
   for(bool Stop=false;!Stop;N+=1+(N>2))
     {
      Stop=true;
      multiset<Data>::iterator s=Set.begin();
      while((s!=Set.end())&&(s->V<=N))
        {
         if(s->V==N) Stop=false;
         Data d=*s;
         d.V+=2*(*(d.it));
         Set.erase(s);
         Set.insert(d);
         s=Set.begin();
        }
      if(Stop) Set.insert(Data(3*N,List.insert(List.end(),Ret=N)));         
     }
   return Ret;
  }

int main()
  {
   for(long long N=500000000LL;N>490000000LL;--N)
     {
      cout<<setw(20)<<N;
      Primes Pr;
      long long n=N,mul=1,p=1;
      while((n>1)&&(p*p<n))
        {
         p=Pr.next();
         bool use=false;
         while(!(n%p)) { n/=p; use=!use; }
         if(use) mul*=p;      
        }
      cout<<setw(20)<<N*n*mul;
      long long wynik=2*N;
      for(long double pierw=sqrt(wynik);pierw!=(long long)pierw;pierw=sqrt(wynik=wynik+N)) ;
      cout<<setw(20)<<wynik<<endl;
     }
   return 0;
  }

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