Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Deparazitare externa pisici fara ...

Seriale turcesti/coreene online H...

Merita un Termostat Smart pentru ...

Sfat achizitie MTB Devron Riddle
 Problema mare cu parintii= nervi ...

switch microtik

Permis categoria B la 17 ani

Sfaturi pentru pregatirea de eval...
 Crapaturi placa

cum imi accesez dosarul electroni...

Momentul Aprilie 1964

Sursa noua - zgomot ?
 A fost lansat Ubuntu 24.04 LTS

Pareri apartament in zona Berceni?

Free streaming SkyShowtime de la ...

Skoda Fabia 1.0 TSI (110 CP)- 19 ...
 

Problema numere10 de pe campion [variabile globale]

- - - - -
  • Please log in to reply
10 replies to this topic

#1
Quaintej

Quaintej

    Junior Member

  • Grup: Junior Members
  • Posts: 41
  • Înscris: 08.11.2015
Buna ziua! Intalnesc o eroare la problema numere10 de pe campion,aceasta fiind " Killed by signal: 9 ".
Ce inseamna?
Tin sa precizez ca daca rulez programul folosind datele din exemplu, rezultatul e corect.
Link : http://campion.edu.r...on=view&id=1383
Sursa mea este :
#include <fstream>
#include <cmath>
using namespace std;
ifstream fin("numere10.in");
ofstream fout("numere10.out");
int n,a,i,j,prim[1000001],d,nr,x;
void ciur(int x)
{
int di,m;
prim[1]=0;
for (di = 2; di <= x; di++)
prim[di] = 1;
for (di = 2; di <= x; di++)
	 if ( prim[di] == 1 )
		 for (m = 2 * di; m <= x; m += di)
		 prim[m] = 0;
}
int main()
{
fin>>n;
ciur(1000000);
for( i=1; i<=n; i++)
{
	 fin>>a;
	 if( prim[a] == 0 )
	 for( d=2; d<=sqrt(a); d++)
		 if( a%d==0 && prim[d]==1 && prim[a/d]==1 )
		 {
			 nr++;
			 break;
		 }
}
fout<<nr;
fin.close();
fout.close();
return 0;
}

Iar ideea mea a fost ca pentru fiecare număr a dintre cele n, se va verifica proprietatea de număr “aproape prim”, astfel:
– caut primul divizor d al lui a care este număr prim
– se verifică dacă a/d este număr prim. Dacă da, am găsit un număr apropae prim
Multumesc anticipat!

Edited by Quaintej, 15 January 2017 - 17:00.


#2
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,442
  • Înscris: 10.08.2005
Si cu memoria ce ai avut ?
int prim[1000001]


#3
Quaintej

Quaintej

    Junior Member

  • Grup: Junior Members
  • Posts: 41
  • Înscris: 08.11.2015
La ce va referiti mai exact?

#4
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,442
  • Înscris: 10.08.2005

Quote

Restricţii
• 1 ≤ n ≤ 10000
• Numerele citite sunt valori naturale cuprinse între 1 şi 1000000
de ce ai un sir de 1000000 de numere si nu 10000 ?

#5
Quaintej

Quaintej

    Junior Member

  • Grup: Junior Members
  • Posts: 41
  • Înscris: 08.11.2015
vectorul prim ma ajuta sa verific daca un numar a este prim sau nu, iar cum numarul citit a este cuprins între 1 şi 1000000, am considerat ca am nevoie de 1000000 de valori de 0 sau 1 in vectorul prim.
Nu retin numerele citite in niciun vector, nu am considerat ca are rost sa ocup memorie pentru ele.
Totusi, am observat ca daca modific de la 1000000 la 10000 primesc 10 puncte si in rest wrong answer.

#6
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,442
  • Înscris: 10.08.2005
Trecand peste implementarea nereusita a faimosului ciur,
citeste - https://oeis.org/A001358 -

tu oricum ocupi memorie cand declari "vectorul" ala de un milion de elemente

Edited by MarianG, 15 January 2017 - 19:38.


#7
Quaintej

Quaintej

    Junior Member

  • Grup: Junior Members
  • Posts: 41
  • Înscris: 08.11.2015
Cum as putea sa imi imbunatatesc ciurul?
Nu am facut multe probleme cu ajutorul lui si sunt cam pe langa.

#8
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,442
  • Înscris: 10.08.2005
Explica ce faci cu functia ciur, apoi ce face acel for( d=2; d<=sqrt(a); d++)

#9
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,238
  • Înscris: 24.02.2007
Vectorul tau e prea mare pentru stiva.

1000001 intregi  = 4 000 000 bytes

1000001 char (ca doar nu vrei mai mult decat 0/1) / 2 (n-o sa ai numar mai mare de 500.000 de verificat daca-i prim) = 500.001 bytes (8x mai putin)

Daca te folosesti de operatii pe biti mai poti imparti la inca 8 totul, cu pretul unor calcule.

Mai scapi apoi si de sqrt ca-i lent si-l apelezi prea des, si mai mult ca sigur te incadrezi in timp

Si sa nu uit, cred ca ti-am repatat pe fiecare topic: RENUNTA LA VARIABILE GLOBALE


#include <fstream>

void populateSieve(unsigned char* items, int maxValue)
{
	items[0] = items[1] = 0;
	for (int i = 2; i < maxValue; ++i)
	{
		items[i] = 1;
		if (items[i] == 1)
		{
			for (int multiple = 2 * i; multiple < maxValue; multiple += i)
				items[multiple] = 0;
		}
	}
}

int main()
{
	std::ifstream in("numere10.in");

	int numberOfItems;
	in >> numberOfItems;

	unsigned char isPrime[500001];
	populateSieve(isPrime, sizeof(isPrime) / sizeof(isPrime[0]));

	int result = 0;

	for (int i = 1; i < numberOfItems; ++i)
	{
		int number;
		in >> number;

		if (isPrime[number] == 0)
		{			
			for (int divider = 2; divider * divider <= number; ++divider)
			{				
				if (number % divider == 0 && isPrime[divider] && isPrime[number / divider])
				{
					++result;
					break;
				}
			}
		}
	}
	std::ofstream out("numere10.out");
	out << result;
	return 0;
}


Edited by dani.user, 20 January 2017 - 22:51.


#10
Quaintej

Quaintej

    Junior Member

  • Grup: Junior Members
  • Posts: 41
  • Înscris: 08.11.2015

View Postdani.user, on 20 ianuarie 2017 - 19:35, said:

for (int multiple = 2 * i; multiple <= i; multiple += i)

Ce inseamna?
Ma refer, de ce multiple merge pana la i, cand el incepe cu valoarea 2*i?

Edited by Quaintej, 20 January 2017 - 21:11.


#11
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,238
  • Înscris: 24.02.2007
Am corectat

Anunturi

Chirurgia cranio-cerebrală minim invazivă Chirurgia cranio-cerebrală minim invazivă

Tehnicile minim invazive impun utilizarea unei tehnologii ultramoderne.

Endoscoapele operatorii de diverse tipuri, microscopul operator dedicat, neuronavigația, neuroelectrofiziologia, tehnicile avansate de anestezie, chirurgia cu pacientul treaz reprezintă armamentarium fără de care neurochirurgia prin "gaura cheii" nu ar fi posibilă. Folosind tehnicile de mai sus, tratăm un spectru larg de patologii cranio-cerebrale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate