Показать сообщение отдельно
Старый 27.11.2012, 00:33   #1
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Оптимизация

Вчера начал делать сборку функций для работы с большими числами. Пока что сделано: умножение, сложение, вычисление факториала, декремент.
Вот и сам код:

string IntToString(int number)
{
	if (number == 0)
		return "0";
	string temp="";
	string returnvalue="";
	while(number>0)
	{
		temp+=number%10+48;
		number/=10;
	}
	for (int i=0;i<temp.length();i++)
		returnvalue+=temp[temp.length()-i-1];
return returnvalue;
}

char IntToChar(int num)
{
	return (num+'0');
}

string dec(string str)
{
	int temp=0;
	string rez="";
	for (int i = str.length()-1; i >=0; i--)
	{
		if (str[i]!='0')
		{
			str[i]=IntToChar((str[i]-'0')-1);
			break;
		}
		else
		{
			str[i]='9';
			temp=1;
		}
	}

				if (str[0]!='0')
				{
				for (int i = 0;i<str.length();i++)
					rez+=str[i];
				}
				else
				{
				for (int i = 1;i<str.length();i++)
					rez+=str[i];
				}

			return rez;
}

string add(string str1,string str2)
{
	string rez="";
	int a=0;
	int b=0;
	int temp=0;
	if (str2.length()>str1.length())
	{
		string tmp;
		tmp=str2;
		str2=str1;
		str1=tmp;
	}
		for (int i = 0; i < str2.length() ; i++)
		{

			a=str1[str1.length()-1-i]-'0';
			b=str2[str2.length()-1-i]-'0';
			if (a+b+temp<10)
			{
				rez=IntToString(a+b+temp)+rez;
				temp=0;
			}
			else
			{
				rez=IntToString((a+b+temp)%10)+rez;
				temp=1;
			}

		}
		for (int i = 0; i < str1.length()-str2.length();i++)
			{
			if (temp == 1)
			{
				
				if (temp+(str1[str1.length()-i-str2.length()-1]-'0')>9)
				{
					rez='0'+rez;
					temp=1;
				}
				else
				{
					rez=IntToString(temp+(str1[str1.length()-i-str2.length()-1]-'0'))+rez;
					temp=0;
				}
			}
			else
				rez=str1[str1.length()-i-str2.length()-1]+rez;
		}
		if (temp==1)
			rez='1'+rez;
	
	
	return rez;
}

string multi(string str1, string str2)
{
	int a = 0;
	int b = 0;
	int temp = 0;
	string rez = "";
	if (str2.length()>str1.length())
	{
		string tmp=str2;
		str2=str1;
		str1=tmp;
	}
	string *tempS= new string[str2.length()];
	for (int i = 0; i < str2.length(); i++)
	{
		for (int j = 0; j < str1.length(); j++)
		{
			a=str1[str1.length()-1-j]-'0';
			b=str2[str2.length()-1-i]-'0';
			tempS[i]=IntToString((a*b+temp)%10)+tempS[i];
			temp=(a*b+temp)/10;
		}
			if (temp!=0)
		tempS[i]=IntToString(temp)+tempS[i];
			temp=0;
	}
	for (int i = str2.length()-1;i>=0;i--)
	{
		for (int j = 0; j<i;j++)
		{
			tempS[i]+='0';
		}
		rez=add(rez,tempS[i]);

	}
	return rez;
}

string fact(string str)
{

 return (str.length()==1 && str[0]=='1') ? "1" : multi(str,fact(dec(str))) ;
}

В общем, мне нужна помощь с оптимизацией, так как скорость совсем не радует. Я новичок в C++, так что многое, скорее всего, выглядит очень нелепо, но начинать всё же надо с чего-то
P.S. простите, код пока не оформлен.
(Offline)
 
Ответить с цитированием