Znao sam da je nešto prejednostavno, mislim da sam čak promjenio za najveci u long long al očito treba i za i... Hvala :D
Programiranje u C++-u - pitanja i odgovori
- poruka: 7.283
- |
- čitano: 1.511.388
- |
- moderatori:
Lazarus Long, XXX-Man, vincimus
- +/- sve poruke
- ravni prikaz
- starije poruke gore
Znao sam da je nešto prejednostavno, mislim da sam čak promjenio za najveci u long long al očito treba i za i... Hvala :D
Ne možeš to tako raditi, vrtiš cijeli interval što je nepotrebno i kod velikih brojeva presporo.
Ako u intervalu do kvadratnog korjena broja taj broj nema prim faktora, on je prim, a ako imaš prim faktore u tom intervalu, veći faktor izvan intervala izračunaš pomoću manjeg faktora iz intervala.
Ovdje je interval do kvadratnog korjena broja i sam velik, ali ipak dovoljno brzo se prijeđe i u najduljem slučaju kad je broj prim, što nije slučaj kod zadanog broja.
Nije samo to, vec i kad nadjes neki faktor, mozes podijelit s njima i srezat originalni broj. Njegov algoritam je kriminalno neefikasan, skoro doslovno, ja bih davao 3-6mj uvjetne kazne, cisto radi primjera :)
Taj program prakticki nece zavrsit. Nakon minute na 3.4GHz procesoru nije jos dosao ni do 300,000, a ima duplu petlju, dakle kvadratna ovisnost. Malo sam bacio grubu racunicu i kod mene bi trebalo oko 7.6 milijuna godina da program zavrsi. To svakako nije bilo ciljano rjesenje na tom Euler projekt zadatku.
Npr. ovo zavrsi u manje od sekunde:
long long broj = 600851475143;
long long najveci = broj;
long long faktor = 3;
long long korijenBroja = long long(sqrt(double(broj)));
while (broj>1 || faktor>korijenBroja)
{
if (broj % faktor == 0)
{
najveci = faktor;
while (broj % faktor == 0)
broj /= faktor;
}
++faktor;
}
Ja sam ovako napisao, i kad je prim sa 12 znamenki izbaci rezultat u trenu.
#include<iostream>
using namespace std;
int main() {
long long broj = 600851475143, prim = 2;
while (broj > 1 && prim * prim <= 600851475143)
{
if (broj % prim == 0)
broj /= prim;
else
prim++;
}
if (broj > 1)
cout << broj;
else
cout << prim;
return 0;
}
Pozdrav, imam jedno pitanje, ako mi netko može objasniti ovaj dio koda s markerom
nije mi jasno što bi trebalo biti ovo char *dolijepi, znam da se radi o funkciji, al ne kužim, čemu taj * ispred dolijepi
#include <iostream>
using namespace std;
char *dolijepi(const char *prvi, const char *drugi, char *spojeni) {
spojeni = new char[80]; // lokalno polje znakova
char *indeks = spojeni;
while (*prvi)
*(indeks++) = *(prvi++);
while (*drugi)
*(indeks++) = *(drugi++);
*indeks = '\0';
return spojeni; // pogreška: pokazivač
// na lokalni objekt
}
int main() {
char *pocetak = "Dobar ";
char *kraj = "dan";
char *zajedno = dolijepi(pocetak, kraj, spojeni);
cout << zajedno << endl;
char z;
cin >> z;
return 0;
}
Pozdrav, imam jedno pitanje, ako mi netko može objasniti ovaj dio koda s markerom
nije mi jasno što bi trebalo biti ovo char *dolijepi, znam da se radi o funkciji, al ne kužim, čemu taj * ispred dolijepi
#include <iostream>
using namespace std;
char *dolijepi(const char *prvi, const char *drugi, char *spojeni) {
spojeni = new char[80]; // lokalno polje znakova
char *indeks = spojeni;
while (*prvi)
*(indeks++) = *(prvi++);
while (*drugi)
*(indeks++) = *(drugi++);
*indeks = '\0';
return spojeni; // pogreška: pokazivač
// na lokalni objekt
}
int main() {
char *pocetak = "Dobar ";
char *kraj = "dan";
char *zajedno = dolijepi(pocetak, kraj, spojeni);
cout << zajedno << endl;
char z;
cin >> z;
return 0;
}
Funkcija vraća char pokazivač na char niz, dakle, treći argument u funkciji je suvišan.
Kužim to nego jel onaj * ispred dolijepi služi samo kao pokazivač funkciji
da vraća taj string u main. Taj primjer ionako ne vrijedi jer se taj spojeni
uništi jer se radi o lokalnoj varijabli.
Kužim to nego jel onaj * ispred dolijepi služi samo kao pokazivač funkciji
da vraća taj string u main. Taj primjer ionako ne vrijedi jer se taj spojeni
uništi jer se radi o lokalnoj varijabli.
Ne uništi se dok ga ti ne uništiš sa delete jer je dinamički alociran, od tud imaš zajedno, i on pokazuje na njega kad se funkcija izvrši.
znači nebitno što se radi o funkciji i kao lokalnom objektu svaki put trebam stavit delete
znači nebitno što se radi o funkciji i kao lokalnom objektu svaki put trebam stavit delete
Dealociraš niz koji si dinamički alocirao, nebitno kojim pokazivačem, bitno je da pokazuje na taj niz i da ga u funkciji možeš dohvatiti, bit funkcije i jest da ti vraća pokazivač na taj niz u funkciji iz koje ovu funkciju pozivaš.
Koja je razilka izmedu ovoga i onoga gore, jos samo to me zanima?
char dolijepi (const char *prvi, const char *, char * spojeni=0)
Nije samo to, vec i kad nadjes neki faktor, mozes podijelit s njima i srezat originalni broj. Njegov algoritam je kriminalno neefikasan, skoro doslovno, ja bih davao 3-6mj uvjetne kazne, cisto radi primjera :)
Taj program prakticki nece zavrsit. Nakon minute na 3.4GHz procesoru nije jos dosao ni do 300,000, a ima duplu petlju, dakle kvadratna ovisnost. Malo sam bacio grubu racunicu i kod mene bi trebalo oko 7.6 milijuna godina da program zavrsi. To svakako nije bilo ciljano rjesenje na tom Euler projekt zadatku.
Npr. ovo zavrsi u manje od sekunde:
long long broj = 600851475143;
long long najveci = broj;
long long faktor = 3;
long long korijenBroja = long long(sqrt(double(broj)));
while (broj>1 || faktor>korijenBroja)
{
if (broj % faktor == 0)
{
najveci = faktor;
while (broj % faktor == 0)
broj /= faktor;
}
++faktor;
}
Ovo bi trebalo ispraviti, vrijedi samo za slučaj kad broj ima prim faktore manje od njegovog kvadratnog korijena, što kod ovog broja jest slučaj.
faktor <= korijenBroja
A u tom slučaju imamo puni interval ako je broj prim, a ako su svi primovi u granici kvadratnog korijena, nepotrebno vrti do kvadratnog korijena.
Dakle, ako petlju ne zaustavi broj, neka je zaustavi kvadratni korijen, a ako petlju zaustavi kvadratni korijen, znamo da iza tog intervala imamo samo jedan prim faktor, nebitno, broj sam ako je prim ili neki prim faktor tog broja.
Ovo bi trebalo ispraviti, vrijedi samo za slučaj kad broj ima prim faktore manje od njegovog kvadratnog korijena, što kod ovog broja jest slučaj.
faktor <= korijenBroja
Imas pravo. Uvjet bi trebao biti "broj>1 &&faktor<=korijenBroja". Kad sam testirao, nisam uopce imao taj uvjet nego sam ga bez provjere dodao kad sam pisao post... Ostatak je ista ideja kao i tvoj kod.
Ovo bi trebalo ispraviti, vrijedi samo za slučaj kad broj ima prim faktore manje od njegovog kvadratnog korijena, što kod ovog broja jest slučaj.
faktor <= korijenBroja
Imas pravo. Uvjet bi trebao biti "broj>1 &&faktor<=korijenBroja". Kad sam testirao, nisam uopce imao taj uvjet nego sam ga bez provjere dodao kad sam pisao post... Ostatak je ista ideja kao i tvoj kod.
Bio sam našao jedan broj sa 12 znamenki koji je prim pomoću onih online kalkulatora, brzo je program izbacio taj broj kao faktor, čak i ako traže vremensko ograničenje, prolazi vjerojatno.
Valjda ne traže ništa više od ovoga na tom projektu, uzastopno dijeljenje sa faktorom, što si dobro naglasio, a ja zaboravio naglasiti i interval do kvadratnog korijena, kojeg uvodimo radi veličine broja.
Pozz
Trebam pomoć u vezi završnog rada. Imam temu Mjerenje jačine zaporke - izrada programa u C/C++
Dakle radi se o Brute force programu koji ja treba napraviti. Ja znam što je Brute force i kako radi, ali ne znam
napisati program u C++. Googlao sam i našao nekoliko programa koji rade ono što meni treba, ali problem je u tome
što ih ja ne razumijem. Treba mi netko tko je to vec radio ili ima iskustva sa tim da mi objasni program.
Također bi bili korisni i izvori o Brute forcu.
Evo programa:
Ako netko ima jednostavniji program ili zna pojednostaviti ovaj bio bi mu zahvalan na pomoći.
Pozz
Trebam pomoć u vezi završnog rada. Imam temu Mjerenje jačine zaporke - izrada programa u C/C++
Dakle radi se o Brute force programu koji ja treba napraviti. Ja znam što je Brute force i kako radi, ali ne znam
napisati program u C++. Googlao sam i našao nekoliko programa koji rade ono što meni treba, ali problem je u tome
što ih ja ne razumijem. Treba mi netko tko je to vec radio ili ima iskustva sa tim da mi objasni program.
Također bi bili korisni i izvori o Brute forcu.
Evo programa:
Ako netko ima jednostavniji program ili zna pojednostaviti ovaj bio bi mu zahvalan na pomoći.
Ako imas temu Mjerenje jačine zaporke onda ti ne treba brute force program, jer kao sto vidis u brute force-u postoje neka pravila, npr prvo krece sa samo malim slovima pa onda ukljucuje i velka pa brojeve itd... Sto znaci da tvoj program moze po tome principu mjeriti jacinu lozinke da gleda dali se sastoji od samo malih ili i velikih slova...
Možda ste me krivo shvatili, ja moram napraviti brute force program i onda isprobavati određene lozinke i raditi
izračune koliko treba za koji znak da se probije.
Pozz
Trebam pomoć u vezi završnog rada. Imam temu Mjerenje jačine zaporke - izrada programa u C/C++
Dakle radi se o Brute force programu koji ja treba napraviti. Ja znam što je Brute force i kako radi, ali ne znam
napisati program u C++. Googlao sam i našao nekoliko programa koji rade ono što meni treba, ali problem je u tome
što ih ja ne razumijem. Treba mi netko tko je to vec radio ili ima iskustva sa tim da mi objasni program.
Također bi bili korisni i izvori o Brute forcu.
Evo programa:
Ako netko ima jednostavniji program ili zna pojednostaviti ovaj bio bi mu zahvalan na pomoći.
Brute force nije poseban algoritam nego opis algoritma koji iskušavanjem svih mogućih kombinacija dolazi do rješenja.
U ovom slučaju brute force nije nešto što bi rado napisao jer to znači uz testiranje sigurnosti šifre i razbijanje šifre, a to su već hackerska posla, tako da se čudim
postavljenom zadatku.
Brute force nije poseban algoritam nego opis algoritma koji iskušavanjem svih mogućih kombinacija dolazi do rješenja.
U ovom slučaju brute force nije nešto što bi rado napisao jer to znači uz testiranje sigurnosti šifre i razbijanje šifre, a to su već hackerska posla, tako da se čudim postavljenom zadatku.
...Dali netko zna gdje mogu pronaći izvore na hrvatskom u Brute force-u i sigurnosti lozinki ?
Napisati C program koji u polje naziva brojevi sprema reference na M brojevnih nizova. Vrijednost M, te brojevni nizovi učitavajuse putem tipkovnice. Brojevni nizovi su varijabilne duljine i sadrže cjelobrojne vrijednosti. Prije unosa svakog niza korisnika se pita koliko će taj niz biti dugačak. Dinamički alocirati samo onoliko memorije koliko je potrebno za spremanje podataka.
Nakon učitavanja ispisati prvi niz i njegovu sumu korištenjem zapisa iz polja brojevi.
Može mala pomoć, kako da dohvatim vrijednosti 1. niza? Hvala.
int main()
{
int i, j, m, n, sumapniza=0;
int brojevi[]={0};
int *Ptbrojevi, *Ptniz;
do{
printf("Unesite broj referenci M brojevnih nizova u polju brojevi: ");
scanf_s("%d,", &m);
}while(m<=0);
Ptbrojevi=&brojevi[0];
for(i=0;i<m;i++)
{
printf("Unesite broj elemenata %d. niza: ", i+1);
scanf("%d", &n);
Ptniz=(int*) malloc(n*sizeof(int));
for(j=0;j<n;j++)
{
printf("Unesite %d. element %d. niza: ", j+1, i+1);
scanf("%d", Ptniz+j);
}
Ptbrojevi=Ptniz;
Ptbrojevi++;
}
free(Ptniz);
return 0;
}
EDIT: Riješeno!
Brute force nije poseban algoritam nego opis algoritma koji iskušavanjem svih mogućih kombinacija dolazi do rješenja.
U ovom slučaju brute force nije nešto što bi rado napisao jer to znači uz testiranje sigurnosti šifre i razbijanje šifre, a to su već hackerska posla, tako da se čudim postavljenom zadatku.
...Još nisam vidio da je neki programer iz tog poduzeća na forumima pisao kod za te webcam keepere, koliko bi takav publike okupio, netko iz profesionalne znatiželje, a netko bome tko zna iz kakvih motiva
Ima nekog da se malo bolje razumije u Qt? Lp
Još nisam vidio da je neki programer iz tog poduzeća na forumima pisao kod za te webcam keepere, koliko bi takav publike okupio, netko iz profesionalne znatiželje, a netko bome tko zna iz kakvih motiva
Ma znam sve, ali velim cini mi se da je rekao da mu to treba za zavrsni rad, pa vjerojatno je onda profesor imao na umu nesto kao pentest ili sl. ;)
Ima nekog da se malo bolje razumije u Qt? Lp
Sto te muci?
Evo trebala bi mi mala pomoć oko izmjene zadatka. Naime umjesto upisivanja niza brojeva, potrebno je da se ucitaju random brojevi i poredaju po vrijednosti.
To sam mislio napraviti pomocu rand() u for petlji i time(NULL), da se ne ponavljaju isti brojevi kod pokretanja, ali ne znam ucitati te random brojeve u memoriju!
Unaprijed hvala!!
#include <iostream>
using namespace std;
const int MAX=100;
void main()
{ int niz[MAX];
int i,j,n, rb, pom;
do
{ cout<<"n=";
cin>>n;}
while ((n<1) || (n>100));
// unos niza brojeva
for ( i=1; i<=n; i++ )
{ cout<<"Unesite broj:";
cin>>niz[i-1]; }
// algoritam sortiranja
for ( i=0; i<n-1; i++ )
{
for ( j=i+1, rb=i; j<n; j++ )
if (niz[j] < niz[rb]) rb=j;
if (rb!=i)
{ pom=niz[i];
niz[i]=niz[rb]; niz[rb]=pom; }
}
// ispis sortiranog niza
cout<<endl<<"Sortirani niz:";
for ( i=0; i<n; i++ )
cout<<niz[i]<<"\t";
cout<<endl;
system("pause");
}
ja bi ispred stavia srand i postavia neku varijablu tipa r
int r =srand(), tako nešto
pa onda u petlji gdje upisuješ stavio n[i]=r;
Evo uspio, nije bio toliki problem :)
Ako nekom bude trebalo slucajno...
#include <iostream>
#include<iomanip>
#include<cstdlib>
using namespace std;
const int MAX=100;
void main()
{
srand(time(NULL));
int niz[MAX];
int i,j,n, rb, pom;
do
{ cout<<"Upisite koliko zelite brojeva ucitati!"<<endl;
cout<<"n=";
cin>>n;}
while ((n<1) || (n>100));
// unos niza brojeva
for ( i=1; i<=n; i++ )
{
niz[i-1]=(float)rand()/RAND_MAX*100+1;
}
// algoritam sortiranja
for ( i=0; i<n-1; i++ )
{
for ( j=i+1, rb=i; j<n; j++ )
if (niz[j] < niz[rb]) rb=j;
if (rb!=i)
{ pom=niz[i];
niz[i]=niz[rb]; niz[rb]=pom; }
}
// ispis sortiranog niza
cout<<endl<<"Sortirani niz : ";
for ( i=0; i<n; i++ )
cout<<niz[i]<<" < ";
cout<<endl;
system("pause");
}
Jel moguće i kako deklarirat polje stringova? Primjerice za upis više imena...
Jel moguće i kako deklarirat polje stringova? Primjerice za upis više imena...
C-string:
char arrStrings[10][50] // 10 stringova duljine 50 charova, statička alokacija
// dinamička alokacija uspomoć malloc-a, dimenzije mogu biti određene u run timeu
char **arrStrings = (char*)malloc(10 * sizeof(char*)); // obavezan cast u C++-u, malloc vraća void*
for(int i = 0; i < 10; ++i)
arrStrings[i] = (char)malloc(50 * sizeof(char));
// dinamička alokacija uspomoć operatora new
char **arrStrings = new char*[10];
for(int i = 0; i < 10; ++i)
arrStrings[i] = new char[50];
Uporabom STL-a (postoji još containera, naravno):
std::array<std::string, 10> arrStrings; // veličina poznata u compile timeu (u primjeru 10)
std::vector<std::string> vecStrings; // proizvoljna veličina
Ima još raznih kombinacija navedenih pristupa.
Jel moguće i kako deklarirat polje stringova? Primjerice za upis više imena...
string ime[10]; // 10 imena
ili još bolje pomoću vektora jer se onda ne moraš brinuti o dinamičkoj alokaciji memorije
vector<string> ime;
pomoću metode push_back dodaješ jedan po jedan string i za njega se mjesto u vektoru automatski alocira.