Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Motorola E32, se aprinde flashlig...

La mulți ani @sylvius!

Joy Berceni Biruintei 87

Recomandare suport tableta
 Vanzare apartament

Adaptare motor nou la unele elect...

Sfat achizitie mirrorless Lumix

Romania printre primele poziții d...
 Pisica din Iasi care a mers sa na...

PC fara wifi, conectare smart mon...

Masina cu buget redus

Renovare garsoniera 40 m.p. - ins...
 Amorsa

Catel gasit pe strada

Arhiva tar - descarcare nesigura ...

Racord flexibil gaz in loc de apa
 

Program care calculează puteri cu baze mici la exponenți mari depășește 0,1 secunde

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

#19
MihaiProg

MihaiProg

    Member

  • Grup: Members
  • Posts: 345
  • Înscris: 08.02.2016
@antoniu200: Ce limbaj de programare ai utilizat???
codeblocks pare sa fie destul de bun zic eu.

Metoda Karatsuba de fapt ruleaza mai incet ca metoda traditionala desi face mai putine inmutiri.

#20
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,225
  • Înscris: 24.02.2007
Nu cred ca ii cere cineva algoritmi avansati de lucru cu numere mari pentru olimpiada. Prea specific (nu-l folosesti la altceva) si prea complex.

#21
MihaiProg

MihaiProg

    Member

  • Grup: Members
  • Posts: 345
  • Înscris: 08.02.2016
Bine, deci se cauta solutii mai simple.
O solutie ar fi adaugarea a doua metode:
bool IsZero(unsigned short a[])
{
for (unsigned i = 2559; i > 2559 - a[0]; i--)
	 if (a[i] != 0)
	 return false;
return true;
}

void divideBy2(unsigned short (&a)[2560]) {
int transfer = 0;
for (unsigned i = 2560 - a[0]; i <= 2559; i++) {
		 if (!transfer) {
				 transfer = a[i] & 1;  // modulo 2
				 a[i] = a[i] >> 1;  // divide by 2
				 if (i == 2560 - a[0] && a[i] == 0)
						 a[0]--, i = 2559 - a[0];
		 } else {
				 transfer = transfer * 10 + a[i];
				 a[i] = transfer >> 1;  // divide by 2
				 transfer = transfer & 1;  // modulo 2
		 }
}
}

Si acum le utilizam la sfarsitul metodei void multiply(unsigned short (&a)[2560], unsigned short b[]) {
while (!IsZero(ex))
{
		 if (ex[2559] & 1)  // if modulo 2 is not zero
			multiply(result, bs);
		 multiply(bs, bs);
		 divideBy2(ex);
}
return convert_big_to_string(result);
}

Nu am facut decat sa inlocuiesc operatiile modulo 2 (%2) cu (&1)
si impartirea cu 2 cu >> 1 (left shift).
Modul de stocare al numerelor este ciudat in opinia mea: ar trebui sa calculezi maximul de cifre necesare,
si sa aloci dinamic dimesiunea necesara pentru a stoca numerele:
renunta la unsigned short (&a)[2560]

#22
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,225
  • Înscris: 24.02.2007

 IvanMihai, on 22 februarie 2020 - 21:45, said:

Nu am facut decat sa inlocuiesc operatiile modulo 2 (%2) cu (&1)
si impartirea cu 2 cu >> 1 (left shift).

Asta face automat orice compilator ce se respecta. Sunt mai destepte decat ne asteptam.

https://godbolt.org/z/QTLjdE

#23
antoniu200

antoniu200

    Junior Member

  • Grup: Junior Members
  • Posts: 145
  • Înscris: 25.07.2019

 MarianG, on 21 februarie 2020 - 22:49, said:

nu, dar ar fi fost frumos sa explici de la bun inceput ce si de unde ai scos

Da, într-adevăr am avut și eu o atitudine greșită. Dar codul chiar l-am scris destul de lizibil, se putea înțelege.

 dani.user, on 22 februarie 2020 - 19:39, said:

Nu cred ca ii cere cineva algoritmi avansati de lucru cu numere mari pentru olimpiada. Prea specific (nu-l folosesti la altceva) si prea complex.

Mai știi? Trăiești în România. Eu mă pot aștepta la orice de la ei. Oricum, eu mai mult mă duc la olimpiadă că așa cere situația mea cu profesorul de la școală, nu neapărat că mă gândesc că fac vreun rezultat. Nu gândesc așa repede precum vor organizatorii ONI oricum. Eu am nevoie de cel puțin 2 ore să fac o problemă de OJI. Uneori, și la ăstea de Locală stau 2 ore și chiar și mai mult. Nu sunt eu de olimpiade, dacă ar interesa pe cineva părerea mea despre mine.

 IvanMihai, on 22 februarie 2020 - 21:45, said:

Nu am facut decat sa inlocuiesc operatiile modulo 2 (%2) cu (&1)
si impartirea cu 2 cu >> 1 (left shift).
Modul de stocare al numerelor este ciudat in opinia mea: ar trebui sa calculezi maximul de cifre necesare,
si sa aloci dinamic dimesiunea necesara pentru a stoca numerele:
renunta la unsigned short (&a)[2560]

Da, într-adevăr ar fi o chestie să aloc dinamic acel vector, dar se complică prea mult sursa și oricum e deja destul de mare. Mă lovesc de limita de 10 kB în scurt timp la cum scriu eu programe (nu că n-aș fi pățit deja).

Merci mult tuturor de sugestii și de implicare! Chiar îmi face plăcere să văd că vă interesează să ajutați.

#24
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,225
  • Înscris: 24.02.2007
Cand rulez codul initial cu 5 5 5 imi da overflow aici
toAdd[2559 - toAdd[0]] = transfer;


Attached File  Untitled.png   45.73K   14 downloads

Edited by dani.user, 23 February 2020 - 12:27.


#25
antoniu200

antoniu200

    Junior Member

  • Grup: Junior Members
  • Posts: 145
  • Înscris: 25.07.2019
Așa e, face overflow. Am modificat mărimea vectorului static la 3000, din câte am văzut eu cu debuggerul din CB, nu mai face.

#include <fstream>
#include <algorithm>
#define arr_size 3000
using namespace std;
ifstream cin("puteri5.in");
ofstream cout("puteri5.out");
string results[6][3126];
unsigned string_to_unsigned(string a) {
	unsigned num = 0;
	for (unsigned i = 0; i < a.size(); i++)
		num = num * 10 + a[i] - '0';
	return num;
}
void convert_string_to_big(string num, unsigned short (&a)[arr_size]) {
	reverse(num.begin(), num.end());
	for (unsigned i = 0; i < num.size(); i++)
		a[arr_size - 1 - i] = num[i] - '0';
	a[0] = num.size();
}
string convert_big_to_string(unsigned short a[]) {
	string res = "";
	for (unsigned i = arr_size - a[0]; i <= arr_size - 1; i++)
		res += a[i] + '0';
	return res;
}
bool comp(unsigned short a[], int num) {
	unsigned short b[arr_size] = {0};
	unsigned step = arr_size - 1;
	while (num) {
		b[step] = num % 10;
		step--, num /= 10;
	}
	if (a[0] == b[0]) {
		for (unsigned i = arr_size - 1; i > arr_size - 1 - a[0]; i--)
			if (a[i] != b[i])
				return false;
	} else
		return false;
	return true;
}
void divide(unsigned short (&a)[arr_size], int num) {
	int transfer = 0;
	for (unsigned i = arr_size - a[0]; i <= arr_size - 1; i++) {
		if (!transfer) {
			transfer = a[i] % num;
			a[i] /= num;
			if (i == arr_size - a[0] && a[i] == 0)
				a[0]--, i = arr_size - 1 - a[0];
		} else {
			transfer = transfer * 10 + a[i];
			a[i] = transfer / num;
			transfer = transfer % num;
		}
	}
}
void add(unsigned short (&a)[arr_size], unsigned short b[]) {
	unsigned transfer = 0, maximum = max(a[0], b[0]);
	for (unsigned i = arr_size - 1; i > arr_size - 1 - maximum; i--) {
		a[i] += b[i] + transfer;
		transfer = a[i] / 10;
		a[i] %= 10;
	}
	a[0] = maximum;
	if (transfer)
		a[arr_size - 1 - a[0]] = transfer, a[0]++;
}
void multiply(unsigned short (&a)[arr_size], unsigned short b[]) {
	unsigned short total[arr_size] = {0};
	unsigned short minimum = min(b[0], a[0]), maximum = max(a[0], b[0]);
	bool smallerThanA = a[0] > b[0];
	for (int start = arr_size - 1; start > arr_size - 1 - minimum; start--) {
		unsigned short toAdd[arr_size] = {0};
		unsigned transfer = 0;
		if (smallerThanA) {
			for (int i = start; i > start - maximum; i--) {
				toAdd[i] = a[i + arr_size - 1 - start] * b[start] + transfer;
				transfer = toAdd[i] / 10;
				toAdd[i] %= 10;
			}
		} else {
			for (int i = start; i > start - maximum; i--) {
				toAdd[i] = b[i + arr_size - 1 - start] * a[start] + transfer;
				transfer = toAdd[i] / 10;
				toAdd[i] %= 10;
			}
		}
		toAdd[0] = maximum + arr_size - 1 - start;
		if (transfer) {
			toAdd[arr_size - 1 - toAdd[0]] = transfer;
			toAdd[0]++;
		}
		add(total, toAdd);
	}
	for (unsigned i = arr_size - 1; i > arr_size - 1 - total[0]; i--)
		a[i] = total[i];
	a[0] = total[0];
}
string fast_pow(string base, string exponent) {
	if (results[string_to_unsigned(base)][string_to_unsigned(exponent)] == "") {
		unsigned short result[arr_size] = {0};
		unsigned short bs[arr_size] = {0}, ex[arr_size] = {0};
		result[arr_size - 1] = result[0] = 1;
		convert_string_to_big(base, bs);
		convert_string_to_big(exponent, ex);
		while (!comp(ex, 0)) {
			if (ex[arr_size - 1] % 2)
				multiply(result, bs);
			multiply(bs, bs);
			divide(ex, 2);
		}
		results[string_to_unsigned(base)][string_to_unsigned(exponent)] = convert_big_to_string(result);
	}
	return results[string_to_unsigned(base)][string_to_unsigned(exponent)];
}
int main() {
	string a, b, c;
	cin >> a >> b >> c;
	unsigned short total[arr_size] = {0};
	unsigned short one[arr_size] = {0}, two[arr_size] = {0}, three[arr_size] = {0}, four[arr_size] = {0}, five[arr_size] = {0}, six[arr_size] = {0};
	convert_string_to_big(fast_pow(a, fast_pow(b, c)), one);
	convert_string_to_big(fast_pow(a, fast_pow(c, b)), two);
	convert_string_to_big(fast_pow(b, fast_pow(a, c)), three);
	convert_string_to_big(fast_pow(b, fast_pow(c, a)), four);
	convert_string_to_big(fast_pow(c, fast_pow(a, b)), five);
	convert_string_to_big(fast_pow(c, fast_pow(b, a)), six);
	add(total, one);
	add(total, two);
	add(total, three);
	add(total, four);
	add(total, five);
	add(total, six);
	cout << convert_big_to_string(total);
}



#26
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,225
  • Înscris: 24.02.2007
Varianta mea, cu C++ modern. operator< nu-i corect matematic, doar pus acolo pentru cache

#include <algorithm>
#include <fstream>
#include <map>
#include <vector>

class BigNumber
{
public:
	BigNumber() = default;
	explicit BigNumber(unsigned int num)
	{
		while (num) {
			digits_.push_back(num % BASE);
			num /= BASE;
		}
	}
	bool operator<(const BigNumber& other) const
	{
		return digits_ < other.digits_;
	}
	bool operator==(const BigNumber& other) const
	{
		return digits_ == other.digits_;
	}
	unsigned int operator[](const size_t digit) const
	{
		if (digit >= digits_.size()) return 0;
		return digits_[digit];
	}
	unsigned char& operator[](const size_t digit)
	{
		if (digit >= digits_.size())
		{
			digits_.resize(digit + 1);
		}
		return digits_[digit];
	}
	BigNumber& operator+=(const BigNumber& other)
	{
		size_t maxNrDigits = std::max(digits_.size(), other.digits_.size());
		unsigned int carry = 0;
		for (size_t i = 0; i < maxNrDigits; ++i)
		{
			unsigned int sum = (*this)[i] + other[i] + carry;
			carry = sum / BASE;
			(*this)[i] = sum % BASE;
		}
		if (carry)
		{
			(*this)[maxNrDigits] = carry;
		}
		return *this;
	}
	BigNumber operator*(const BigNumber& other) const
	{
		BigNumber total;
		for (size_t i = 0; i < other.digits_.size(); ++i)
		{
			BigNumber current;
			unsigned int carry = 0;
			for (size_t j = 0; j < digits_.size(); ++j)
			{
				unsigned int product = other.digits_[i] * digits_[j] + carry;
				carry = product / BASE;
				current[j] = product % BASE;
			}
			if (carry)
			{
				current[digits_.size()] = carry;
			}
			for (size_t j = 0; j < i; ++j)
			{
				current.digits_.insert(current.digits_.begin(), 0);
			}
			total += current;
		}
		return total;
	}

private:
	static const int BASE = 10;
	friend std::ostream& operator<<(std::ostream& out, const BigNumber& number);

	std::vector<unsigned char> digits_;
};

template<typename T>
T fast_pow(const T& base, const unsigned int exponent)
{
	static thread_local std::map<std::pair<T, unsigned int>, T> cache;

	if (base == T(0)) return T(0);
	if (exponent == 0) return T(1);
	if (exponent == 1) return base;

	auto it = cache.find(std::make_pair(base, exponent));
	if (it != cache.end())
	{
		return it->second;
	}

	T result = fast_pow(base * base, exponent / 2);
	if (exponent % 2 == 1)
	{
		result = result * base;
	}

	cache[std::make_pair(base, exponent)] = result;
	return result;
}

std::ostream& operator<<(std::ostream& out, const BigNumber& number)
{
	if (number.digits_.empty()) return out << '0';
	for (auto it = number.digits_.rbegin(); it != number.digits_.rend(); ++it)
	{
		out << char(*it + '0');
	}
	return out;
}

void abc_powers(std::istream&& in, std::ostream&& out) {
	int abc[3];
	for (int& input : abc)
	{
		in >> input;
	}
	BigNumber total;
	int order[] = { 0, 1, 2 };
	do
	{
		total += fast_pow(BigNumber(abc[order[0]]), fast_pow(abc[order[1]], abc[order[2]]));
	} while (std::next_permutation(std::begin(order), std::end(order)));

	out << total;
}

int main()
{
	abc_powers(std::ifstream("puteri5.in"), std::ofstream("puteri5.out"));
}


Edited by dani.user, 23 February 2020 - 15:33.


#27
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,225
  • Înscris: 24.02.2007
Cu baze puteri ale lui 2 calculele sunt mai rapide.

#28
MihaiProg

MihaiProg

    Member

  • Grup: Members
  • Posts: 345
  • Înscris: 08.02.2016
[(2)^5]^5 = 2^3125 = {[(2^5)^5]^5}^5}^5
(2^5)^4 = {[(2^5)^5]^5}^5

Poate mult prea tarziu dar am o noua solutie simpla,
fa niste verificari inainte de calcula puterile daca nu avem aceleasi numere:
int main()
{
	 string a, b, c;
	 //cin >> a >> b >> c;
	 a = "5";
	 b = "5";
	 c = "5";
	 unsigned short total[arr_size] = {0};
	 unsigned short one[arr_size] = {0}, two[arr_size] = {0}, three[arr_size] = {0}, four[arr_size] = {0}, five[arr_size] = {0}, six[arr_size] = {0};
	 convert_string_to_big(fast_pow(a, fast_pow(b, c)), one);
	 if (a==b&&b==c) // very special case: all values are equal
	 {
	 add(total, one);
	 add(total, one);
	 add(total, one);
	 add(total, one);
	 add(total, one);
	 add(total, one);
	 }
	 else
	 {
	 if (b==c) // then two = one so just copy previous result
	 {
	 for (int i=0;i<arr_size;i++)
	 two[i] = one[i];
	 }
	 else
	 {
	 convert_string_to_big(fast_pow(a, fast_pow(c, b)), two);
	 }
	 convert_string_to_big(fast_pow(b, fast_pow(a, c)), three);
	 if (a==c) // then four = three so just copy previous result
	 {
	 for (int i=0;i<arr_size;i++)
	 four[i] = three[i];
	 }
	 else
	 {
	 convert_string_to_big(fast_pow(b, fast_pow(c, a)), four);
	 }
	 convert_string_to_big(fast_pow(c, fast_pow(a, b)), five);
	 if (a==b) // then six = five so just copy previous result
	 {
	 for (int i=0;i<arr_size;i++)
	 six[i] = five[i];
	 }
	 else
	 {
	 convert_string_to_big(fast_pow(c, fast_pow(b, a)), six);
	 }
	 add(total, one);
	 add(total, two);
	 add(total, three);
	 add(total, four);
	 add(total, five);
	 add(total, six);
}
	 cout << convert_big_to_string(total);
	 return 0;
}


Edited by IvanMihai, 20 March 2020 - 15:56.


#29
MihaiProg

MihaiProg

    Member

  • Grup: Members
  • Posts: 345
  • Înscris: 08.02.2016
Am uitat de o optimizare pentru copiere numere, versiunea reparata aici:
for (unsigned i = arr_size - one[0]; i <= arr_size - 1; i++)
	 two[i] = one[i];

	 two[0] = one[0];


Am spus in trecut ca ar trebui sa ridici exponent1 la exponent2, am gresit:
asta nu va produce optimizare, dimpotriva, deci trebuie sa treci ca parametru baza si cei doi exponenti,
versiunea optimizata: de 2x mai rapid fata de original aici:
string double_pow(string base, string exp1, string exp2) {
unsigned short bs[arr_size] = {0};
convert_string_to_big(base, bs);
unsigned exp1_num = string_to_unsigned(exp1);
unsigned exp2_num = string_to_unsigned(exp2);
while (exp2_num>0)
{
unsigned short old_bs[arr_size] = {0};
switch (exp1_num)
{
case 0: bs[arr_size - 1] = bs[0] = 1; break;

case 1: /* This is one unity: t = x;*/ break;

case 2: multiply(bs, bs); break;

case 3:
for (unsigned i = arr_size - bs[0]; i <= arr_size - 1; i++)
	 old_bs[i] = bs[i];
old_bs[0] = bs[0]; // copy the size also
multiply(bs, bs);
multiply(bs, old_bs);
break;

case 4:
	 multiply(bs, bs);
	 multiply(bs, bs);
	 break;

case 5:
for (unsigned i = arr_size - bs[0]; i <= arr_size - 1; i++)
	 old_bs[i] = bs[i];
old_bs[0] = bs[0]; // copy the size also
multiply(bs, bs);
multiply(bs, bs);
multiply(bs, old_bs);
	 break;

default:
cout<<"Invalid number specified! (should be <=5)";
	 break;
} // switch end

exp2_num--;
} // while end


return convert_big_to_string(bs);
}

Partea ciudata: de cele mai multe ori timpul de executie: 0.047 secunde,
doar ca rareori este si 0.109 secunde sau 0.156 secunde.
Si calculatorul meu este foarte vechi. Doar ca nu inteleg de ce variaza in halul ala!

Edited by IvanMihai, 20 March 2020 - 19:31.


#30
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,225
  • Înscris: 24.02.2007
Cum ai scrie daca ar fi a b c d in loc de doar a b c?

#31
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,225
  • Înscris: 24.02.2007

 IvanMihai, on 20 martie 2020 - 19:29, said:

Partea ciudata: de cele mai multe ori timpul de executie: 0.047 secunde,
doar ca rareori este si 0.109 secunde sau 0.156 secunde.
Si calculatorul meu este foarte vechi. Doar ca nu inteleg de ce variaza in halul ala!

Masurat cum? Probabil se mai excuta diverse in acelasi timp pe calculator.

#32
antoniu200

antoniu200

    Junior Member

  • Grup: Junior Members
  • Posts: 145
  • Înscris: 25.07.2019

 IvanMihai, on 20 martie 2020 - 19:29, said:

Am uitat de o optimizare pentru copiere numere, versiunea reparata aici:
for (unsigned i = arr_size - one[0]; i <= arr_size - 1; i++)
	 two[i] = one[i];

	 two[0] = one[0];


Am spus in trecut ca ar trebui sa ridici exponent1 la exponent2, am gresit:
asta nu va produce optimizare, dimpotriva, deci trebuie sa treci ca parametru baza si cei doi exponenti,
versiunea optimizata: de 2x mai rapid fata de original aici:

Partea ciudata: de cele mai multe ori timpul de executie: 0.047 secunde,
doar ca rareori este si 0.109 secunde sau 0.156 secunde.
Si calculatorul meu este foarte vechi. Doar ca nu inteleg de ce variaza in halul ala!

Eu îți mulțumesc că te implici și că te interesează subiectul!
O să mă uit, când o să apuc, mai bine peste cod, o să dau și un Format use AStyle, că tare îi place forumului să se bage el la reformatat când nu trebuie.
Sper să pot să-ți dau un răspuns cât mai repede dacă ajută sau nu ce ai făcut tu.

Ca fapt divers, dacă calculatorul e de prin 2007-2011, cred că te-ar ajuta un procesor mai modern sau măcar mai performant. S-ar putea să aibă cache-ul ocupat și, când programul este cache-at, se execută în 0,047, iar când iese din cache, ajunge până la 0,156, pentru că reprocesează tot.

Ia în considerare și ce a zis dani.user.

https://en.wikipedia.../wiki/CPU_cache

 dani.user, on 20 martie 2020 - 21:34, said:

Cum ai scrie daca ar fi a b c d in loc de doar a b c?

Dacă întrebarea e pentru mine, pentru mai multe numere aș alege să fac niște vectori 2D, sau matrici cum li se spune pe la noi. Declar ceva de genul:
unsigned n;
cin >> n;
unsigned short a[n][arr_size] = {{0}};


Fac un index de la 0.

Încă nu am lucrat la o soluție dinamică și nici nu am reușit să analizez sursa ce mi-ai trimis-o decât fugitiv.

Edited by antoniu200, 20 March 2020 - 21:54.


#33
MihaiProg

MihaiProg

    Member

  • Grup: Members
  • Posts: 345
  • Înscris: 08.02.2016

Quote

Masurat cum?
CodeBlocks v17.12 reporteaza timpul de executie la terminarea programului,
cumva tind sa cred ca nu in functia main este variatia,
am masurat de acesta data asa:
clock_t time_req;
time_req = clock();
convert_string_to_big(double_pow(a, b, c), one);
time_req = clock() - time_req;
printf("New took %f seconds\r\n",(float)time_req/CLOCKS_PER_SEC);
si raporteaza "New took 0.032 seconds", pe cand timpul de executie raportat de CodeBlocks este de 0.125 secunde.

#34
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,225
  • Înscris: 24.02.2007
Cand masori toata executia aplicatiei masori defapt mult mai multe:
  • Se citeste aplicatia + diverse biblioteci de pe disc (sau din cache)
  • Se mai baga antivirusul in seama
  • Pregateste sistemul de operare terenul pentru a lansa in executie aplicatia
  • Ii vine randul aplicatiei sa ruleze
  • Ruleaza aplicatia - doar asta defapt te intereseaza pe tine
  • Se face curat
Varianta cu clock e mai precisa ca masoara doar ce te intereseaza. Si aici mai poate varia functie de cate mai ruleaza pe sistem la acel moment asa ca e bine sa ai un for cu mai multe iteratii si sa faci o medie. C++11 ofera un timer mult mai precis decat clock()

Si neaparat compilat cu optimizari active.

Edited by dani.user, 21 March 2020 - 10:25.


#35
MihaiProg

MihaiProg

    Member

  • Grup: Members
  • Posts: 345
  • Înscris: 08.02.2016

 dani.user, on 20 martie 2020 - 21:34, said:

Cum ai scrie daca ar fi a b c d in loc de doar a b c?
Sa revenim la cazul anterior a^b^c = a^(b^c)
Am ales sa ridic a la puterea b de c ori!

a^b^c^d = a^(b^c^d)
Nu cred ca se poate calcula altfel, poate ma insel!

Edited by IvanMihai, 21 March 2020 - 12:22.


#36
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,225
  • Înscris: 24.02.2007
Cand am zis a b c d ma gandeam la cum ar arata codul cu multe if/else si variabile one, two, ...

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