Форум

Data.BG Форуми: По филма Gifted - Data.BG Форуми

Прехвърляне към съдържание

Страница 1 от 1
  • Вие не можете да започнете нова тема
  • Вие не може да отговаряте на тази тема

По филма Gifted Trachtenberg system

#1
Потребителят е неактивен   petarcheto 

  • Група: Потребители
  • Мнения: 793
  • Регистриран: 18-December 06
  • Репутация: 27
  • Пол:Мъж
  • Интереси:motori , girls
Търсих след филма дали са ползвали истински имена и попаднах първо на тоя. Изглежда наред, щом са писали в Уикипедия за него. В същата тая Уикипедия намерих код и понеже си пазя Dev C++ от първото висше, реших да пробвам да компилирам кода, който са дали. Добре, ама има някаква грешка.
class Trachtenberg{public:  void multiply(const char* a, const char* b)  {    size_t large = strlen(a);    size_t small = strlen(b);    if (large == 0 || small == 0) {      answer = solution = new char[2]{ '0', '\0' };      return;    }    if (large < small) {      std::swap(a, b);      std::swap(large, small);    }    solution = new char[large + small];    answer = solution + large + small - 1;    *answer = '\0'; // zero terminate    size_t digits = 0;    const char* starta = a + large;    const char* startb = b + small;    intermediate = 0;    while (digits != small) {      multiplystep(++digits, --starta, startb);    }    for (size_t d = digits; d != large; ++d) {      multiplystep(digits, --starta, startb);    }    while (digits != 1) {      multiplystep(--digits, starta, --startb);    }    while (intermediate) {      *--answer = '0' + intermediate % 10;      intermediate /= 10;    }  }  const char* result() const { return answer;  }private:  size_t intermediate;  char* solution = nullptr;  char* answer = nullptr;  void multiplystep(size_t digits, const char* starta, const char* startb)  {    const char* digita = starta;    const char* digitb = startb;    for (size_t n = 0; n != digits; ++n) {      --digitb;      intermediate += (*digita - '0') * (*digitb - '0'); // convert from ASCII string      ++digita;    }    *--answer = '0' + intermediate % 10; // convert back to string    intermediate /= 10;  }};


Грешка ли казах? Грешки. Много. Първата е 'size_t' does not a type... И така нататък. Ако компилирате, ще видите.

Ако може да ми дадете правилния код. Не, че ще го разбера, ама... Интересно ми е.


0

#2
Потребителят е неактивен   georgedimov 

  • Група: Потребители
  • Мнения: 5330
  • Регистриран: 26-May 03
  • Репутация: 61
  • Пол:Мъж
  • Град:Велико Търново
1. Не се публикува програмен код на един ред; :!:
2. Не усещаш ли, че това съвсем не е писано за Windows :unsure:
3. Това, след една камара редактиране при мен с компилатор Dev-C++ 5.11 и ОС Windows 7 32-bit поне се компилира :!:
#include <iostream>
#include <cstring>
using namespace std;

class Trachtenberg{
public:
	void multiply(char* a, char* b)
{   size_t large = strlen(a);
    size_t small = strlen(b);
    if (large == 0 || small == 0)
	{
		char* answer = new char[2];
		char* solution = new char[2];
		for (int i = 0 ; i < 2; ++i)
		{
			answer[i] = solution[i] = '\0';
	}		
	
	}
	if (large < small)
	{
	    std::swap(a, b);
		std::swap(large, small);
	}
	solution = new char[large + small];
	answer = solution + large + small - 1;
	*answer = '\0'; // zero terminate
	size_t digits = 0;
	char* starta = a + large;
	const char* startb = b + small;
	intermediate = 0;
	
	while (digits != small)
	{
		multiplystep(++digits, --starta, startb);
	}
	for (size_t d = digits; d != large; ++d)
	{
		multiplystep(digits, --starta, startb);
	}
	while (digits != 1)
	{
		multiplystep(--digits, starta, --startb);
	}
	while (intermediate)
	{
		*--answer = '0' + intermediate % 10;
		intermediate /= 10;
	}
}  
const char* result() const
{
	return answer;
}

private:
 	size_t intermediate;  
	char* solution = NULL;
	char* answer = NULL;  
	void multiplystep(size_t digits, const char* starta, const char* startb)
	{
		const char* digita = starta;
		const char* digitb = startb;
		for (size_t n = 0; n != digits; ++n) 
		{
			--digitb;
    		intermediate += (*digita - '0') * (*digitb - '0'); // convert from ASCII string	
			++digita;
		}
		*--answer = '0' + intermediate % 10; // convert back to string
		intermediate /= 10;
	}
}; // End of class Trachtenberg -- comment added from me

Мнението беше редактирано от georgedimov: 12.04.18 - 11:19

0

#3
Потребителят е активен   inedx 

  • Група: Потребители
  • Мнения: 2176
  • Регистриран: 16-May 05
  • Репутация: 426
  • Пол:Мъж
  • Град:Варна
Програмата и метода по който е смятал господина нещо не се вързват, на знам защо изобщо са я сложили в Wikipedia
https://en.wikipedia...htenberg_system
ASRock B85 Pro4, Pentium G3240, DD3 8GB/1333MHz,120GB SSD + 4TB + 640GB HDD
Gigabyte GV-R657OC-1GI, CM B500, ASUS 24B1S1, LCD SAMSUNG SM931BW, ME173X
“Μαματα ςι ε εδαλο” — гръцка поговорка
0

#4
Потребителят е неактивен   georgedimov 

  • Група: Потребители
  • Мнения: 5330
  • Регистриран: 26-May 03
  • Репутация: 61
  • Пол:Мъж
  • Град:Велико Търново

Преглед на мнениеinedx, на 14.04.18 - 13:43, каза:

Програмата и метода по който е смятал господина нещо не се вързват, на знам защо изобщо са я сложили в Wikipedia
https://en.wikipedia...htenberg_system

Ми то, малките обикновено са любопитни :unsure: , а сорса в поста ти с неудоволствие ще тествам :sadsad:
0

#5
Потребителят е неактивен   petarcheto 

  • Група: Потребители
  • Мнения: 793
  • Регистриран: 18-December 06
  • Репутация: 27
  • Пол:Мъж
  • Интереси:motori , girls

Преглед на мнениеgeorgedimov, на 11.04.18 - 19:33, каза:

1. Не се публикува програмен код на един ред; Публикувано изображение
2. Не усещаш ли, че това съвсем не е писано за Windows :unsure:
3. Това, след една камара редактиране при мен с компилатор Dev-C++ 5.11 и ОС Windows 7 32-bit поне се компилира Публикувано изображение
#include <iostream>
#include <cstring>
using namespace std;

class Trachtenberg{
public:
	void multiply(char* a, char* b)
{   size_t large = strlen(a);
    size_t small = strlen(b);
    if (large == 0 || small == 0)
	{
		char* answer = new char[2];
		char* solution = new char[2];
		for (int i = 0 ; i < 2; ++i)
		{
			answer[i] = solution[i] = '\0';
	}		
	
	}
	if (large < small)
	{
    	std::swap(a, b);
		std::swap(large, small);
	}
	solution = new char[large + small];
	answer = solution + large + small - 1;
	*answer = '\0'; // zero terminate
	size_t digits = 0;
	char* starta = a + large;
	const char* startb = b + small;
	intermediate = 0;
	
	while (digits != small)
	{
		multiplystep(++digits, --starta, startb);
	}
	for (size_t d = digits; d != large; ++d)
	{
		multiplystep(digits, --starta, startb);
	}
	while (digits != 1)
	{
		multiplystep(--digits, starta, --startb);
	}
	while (intermediate)
	{
		*--answer = '0' + intermediate % 10;
		intermediate /= 10;
	}
}  
const char* result() const
{
	return answer;
}

private:
 	size_t intermediate;  
	char* solution = NULL;
	char* answer = NULL;  
	void multiplystep(size_t digits, const char* starta, const char* startb)
	{
		const char* digita = starta;
		const char* digitb = startb;
		for (size_t n = 0; n != digits; ++n) 
		{
			--digitb;
    		intermediate += (*digita - '0') * (*digitb - '0'); // convert from ASCII string	
			++digita;
		}
		*--answer = '0' + intermediate % 10; // convert back to string
		intermediate /= 10;
	}
}; // End of class Trachtenberg -- comment added from me



Бях копирал целия код от Уикипедия и така и не разбрах защо във форума излезе на 1 ред.


Пак дава грешка(и) в този ред "char* solution = NULL;" нещо в думата solution





0

#6
Потребителят е активен   inedx 

  • Група: Потребители
  • Мнения: 2176
  • Регистриран: 16-May 05
  • Репутация: 426
  • Пол:Мъж
  • Град:Варна
С някой дърт компилатор си и затова. Няма проблем и да не ги инициализираш с NULL;

Сега забелязвам един проблем с функцията multiply() при всяко стартиране заделя нова памет, а старата не я освобождава.

#include <iostream>
#include <cstring>
using namespace std;

class Trachtenberg{
public:
	void multiply(char* a, char* b)
{   size_t large = strlen(a);
    size_t small = strlen(b);
    if (large == 0 || small == 0)
	{
		char* answer = new char[2];
		char* solution = new char[2];
		for (int i = 0 ; i < 2; ++i)
		{
			answer[i] = solution[i] = '\0';
		}		
	
	}
	if (large < small)
	{
	    std::swap(a, b);
		std::swap(large, small);
	}
	solution = new char[large + small];
	answer = solution + large + small - 1;
	*answer = '\0'; // zero terminate
	size_t digits = 0;
	char* starta = a + large;
	const char* startb = b + small;
	intermediate = 0;
	
	while (digits != small)
	{
		multiplystep(++digits, --starta, startb);
	}
	for (size_t d = digits; d != large; ++d)
	{
		multiplystep(digits, --starta, startb);
	}
	while (digits != 1)
	{
		multiplystep(--digits, starta, --startb);
	}
	while (intermediate)
	{
		*--answer = '0' + intermediate % 10;
		intermediate /= 10;
	}
}  
const char* result() const
{
	return answer;
}

private:
 	size_t intermediate;  
	char* solution;
	char* answer;  
	void multiplystep(size_t digits, const char* starta, const char* startb)
	{
		const char* digita = starta;
		const char* digitb = startb;
		for (size_t n = 0; n != digits; ++n) 
		{
			--digitb;
    		intermediate += (*digita - '0') * (*digitb - '0'); // convert from ASCII string	
			++digita;
		}
		*--answer = '0' + intermediate % 10; // convert back to string
		intermediate /= 10;
	}
}; // End of class Trachtenberg -- comment added from me

int main()
{
    Trachtenberg r;
    char a[]="12345678";
    char b[]="200";
    char c[]="1000";
    const char *r1, *r2;
    
    r.multiply(a,b);
    r1=r.result();
    
    r.multiply(a,c);
    r2=r.result();
    
    
    cout<<r1<<endl;
    cout<<r2<<endl;
}

ASRock B85 Pro4, Pentium G3240, DD3 8GB/1333MHz,120GB SSD + 4TB + 640GB HDD
Gigabyte GV-R657OC-1GI, CM B500, ASUS 24B1S1, LCD SAMSUNG SM931BW, ME173X
“Μαματα ςι ε εδαλο” — гръцка поговорка
0

#7
Потребителят е неактивен   georgedimov 

  • Група: Потребители
  • Мнения: 5330
  • Регистриран: 26-May 03
  • Репутация: 61
  • Пол:Мъж
  • Град:Велико Търново

Преглед на мнениеinedx, на 21.04.18 - 16:25, каза:

...
С някой дърт компилатор си и затова. Няма проблем и да не ги инициализираш с NULL;
...

А дали ще може :unsure: // То и компилатора му може и да не е толкова дърт като мен :unsure:

Мнението беше редактирано от georgedimov: 22.04.18 - 01:14

0

#8
Потребителят е неактивен   petarcheto 

  • Група: Потребители
  • Мнения: 793
  • Регистриран: 18-December 06
  • Репутация: 27
  • Пол:Мъж
  • Интереси:motori , girls
Сега компилира, но не мога да въвеждам числа: Публикувано изображение
0

#9
Потребителят е активен   inedx 

  • Група: Потребители
  • Мнения: 2176
  • Регистриран: 16-May 05
  • Репутация: 426
  • Пол:Мъж
  • Град:Варна
Ами то не става само с ядене :chuckle: тая main() функция дето съм я сложил е само за проба, напиши си я както на тебе ти трябва и/или харесва
ASRock B85 Pro4, Pentium G3240, DD3 8GB/1333MHz,120GB SSD + 4TB + 640GB HDD
Gigabyte GV-R657OC-1GI, CM B500, ASUS 24B1S1, LCD SAMSUNG SM931BW, ME173X
“Μαματα ςι ε εδαλο” — гръцка поговорка
0

Споделете тази тема чрез:


Страница 1 от 1
  • Вие не можете да започнете нова тема
  • Вие не може да отговаряте на тази тема

1 потребители четат тази тема
0 регистрирани потребители, 1 гости и 0 анонимни потребители


Data.BG e форум за дискусии. Data.BG не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Data.BG.

Close  Member Login