Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 17.10.2011
Сообщений: 45

работа со строчкой: помогите оптимизировать мой тупой код)

02.02.2012, 14:55. Показов 1357. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Что имеем: строчку в которой записан процесс разложения числа на множетели ,вида 512=2*2*2*2*2*2*2*2*2, а нужно что бы выводило 512=2^9 или если ввести 45=3*3*5 а нужно 45=3^2*5 ну и тд, что получилось это написать временный типа str:=StringReplace(str, str1+str1+str1+str1+str1+str1+str1, inttostr(i)+'^7*', [rfReplaceAll, rfIgnoreCase]); который тупо и долго выполняется. ну и чтоб число было в 10итд степени надо ещё добавлять такие строчки, хочу оптимизировать , но тк опыт програмирования у меня не большой , сижу туплю, мб хелп ми?
ниже исходник

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
procedure TForm1.Button20Click(Sender: TObject); //разложение простых чисел
var  b,n,i,a: integer; c:real; str,str1:string;
begin
a:=strtoint(edit9.Text)  ;
b:=a; c:=a; i:=1;
str:=inttostr(b)+'='+str;
repeat i:=i+1;
if b mod i = 0 then begin   // если наше число делится без остатка на простое число тогда запишем это число в строку
c:=c/i;                             //if c=1 then str:=str+inttostr(i) else - это сразу без знака * в последнем символе
str:=str+inttostr(i)+'*'; b:=round(c); i:=1;
                    end;
until b=1;              // тут можно остановится и вывести результат но он будет без степеней например 16=2*2*2*2
 
for i:=2 to a div 2 do begin str1:=inttostr(i)+'*';
str:=StringReplace(str, str1+str1+str1+str1+str1+str1+str1+str1+str1, inttostr(i)+'^9*', [rfReplaceAll, rfIgnoreCase]);
str:=StringReplace(str, str1+str1+str1+str1+str1+str1+str1+str1, inttostr(i)+'^8*', [rfReplaceAll, rfIgnoreCase]);
str:=StringReplace(str, str1+str1+str1+str1+str1+str1+str1, inttostr(i)+'^7*', [rfReplaceAll, rfIgnoreCase]);
str:=StringReplace(str, str1+str1+str1+str1+str1+str1, inttostr(i)+'^6*', [rfReplaceAll, rfIgnoreCase]);
str:=StringReplace(str, str1+str1+str1+str1+str1, inttostr(i)+'^5*', [rfReplaceAll, rfIgnoreCase]);
str:=StringReplace(str, str1+str1+str1+str1, inttostr(i)+'^4*', [rfReplaceAll, rfIgnoreCase]);
str:=StringReplace(str, str1+str1+str1, inttostr(i)+'^3*', [rfReplaceAll, rfIgnoreCase]);
str:=StringReplace(str, str1+str1, inttostr(i)+'^2*', [rfReplaceAll, rfIgnoreCase]);  end;      //самый долгий и тупой способ который придумал 
for i:=1 to Length(str) do if i=Length(str) then delete(str,i,1); // del last simb             
label4.caption:=(str) ;                                                                       //но он работает, но большие числа типо 10000000 считает долго
end;                                                                                         // ну и a^10 он уже запишет как а^9*2 итд
 
end.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.02.2012, 14:55
Ответы с готовыми решениями:

Помогите оптимизировать мой код
Реально уменьшить этот код где-то на 5 Кб (чем он меньше - тем лучше) но так чтобы все осталось примерно так...

Как мне оптимизировать мой код
в общем, есть компонент Combobox, с помощью его я выбираю тот параметр по которому хочу сортировать свои значения, параметров много, и в...

Помогите оптимизировать код
Помогите пожалуйста оптимизировать код: $text = "Наконец, самое важное, что должен учесть создатель сайта, — это сохранение...

10
 Аватар для Ales'hon'ne
159 / 152 / 50
Регистрация: 03.08.2011
Сообщений: 299
Записей в блоге: 14
02.02.2012, 16:36
Интересная задачка. В DelphiXE2 прокатывает такой код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
uses
  System.SysUtils, Generics.Collections, System.StrUtils;
 
function PowerReplace(s:string):string;
var
  c:string;
  k:TDictionary<string,integer>;
  t:TPair<string,integer>;
begin
  Result:='';
  k:=TDictionary<string,integer>.Create;
  for c in System.StrUtils.SplitString(s,'*') do
    begin
      if k.ContainsKey(c) then
        k.Items[c]:=k.Items[c]+1
      else
        k.Add(c,1)
    end;
  for t in k do
    if t.Value>1 then
      Result:=Result+'*('+t.Key+'^'+IntToStr(t.Value)+')'
    else
      Result:=Result+'*'+t.Key;
  k.Free;
  Delete(result,1,1);
end;
Применять так (только числа и знаки умножения):
Delphi
1
PowerReplace('2*2*2*2*2*2*3*3*3*111*111*91')//(3^3)*(2^10)*91*(111^2)
1
0 / 0 / 0
Регистрация: 17.10.2011
Сообщений: 45
02.02.2012, 17:10  [ТС]
Хмм прикольно но у меня таких юнитов нету, я на delphi 7 сижу
0
 Аватар для Ales'hon'ne
159 / 152 / 50
Регистрация: 03.08.2011
Сообщений: 299
Записей в блоге: 14
02.02.2012, 17:25
Цитата Сообщение от Stani Посмотреть сообщение
Хмм прикольно но у меня таких юнитов нету, я на delphi 7 сижу
Тогда придётся писать женерики самостоятельно и обходиться без foreach. Остальное вроде там есть...
0
0 / 0 / 0
Регистрация: 17.10.2011
Сообщений: 45
02.02.2012, 17:33  [ТС]
Тогда придётся писать женерики самостоятельно и обходиться без foreach. Остальное вроде там есть...
что такое женерики?
0
 Аватар для Ales'hon'ne
159 / 152 / 50
Регистрация: 03.08.2011
Сообщений: 299
Записей в блоге: 14
02.02.2012, 17:43
Должно работать на D7
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
uses
  SysUtils, Classes, Types, StrUtils;
 
function PowerReplaceD7(s:string):string;
var
  c:string;
  k:TStringList;
  i:Integer;
  t:TStringDynArray;
begin
  Result:='';
  k:=TStringList.Create;
  t:=SplitString(s,'*');
  for i:=0 to length(t)-1 do
    begin
      if k.IndexOfName(t[i])>=0 then
        k.Values[t[i]]:=IntToStr(StrToInt(k.Values[t[i]])+1)
      else
        k.Add(t[i]+'=1')
    end;
  for i:=0 to k.Count-1 do
    if StrToInt(k.ValueFromIndex[i])>1 then
      Result:=Result+'*('+k.Names[i]+'^'+k.ValueFromIndex[i]+')'
    else
      Result:=Result+'*'+k.Names[i];
  k.Free;
  Delete(result,1,1);
end;
А женерики - это открытые типы данных.
1
0 / 0 / 0
Регистрация: 17.10.2011
Сообщений: 45
02.02.2012, 18:03  [ТС]
на 13 строчке ошибка почемуто, что значит splitstring?
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
02.02.2012, 18:39
для простоты будем работать со строкой вида 2*2*2*2*2*2*2*2*2*2
как извлечь ее из 512=2*2*2*2*2*2*2*2*2*2, думаю, знаешь )

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
procedure TForm1.Button1Click(Sender: TObject);
var
  tmp,result,src: string;
  i,n: byte;
  // массив для подсчета количества мнежителей
  parts: array[1..9] of byte;
begin
  src:= Edit1.Text;
  // обнуляем массив
  FillChar(parts,SizeOf(parts),0);
  // убираем знаки умножения
  tmp:= StringReplace(Edit1.Text,'*','',[rfReplaceAll]);
  // перебираем все множители, входящие в строку
  for i:= 1 to Length(tmp) do
  begin
    n:= StrToInt(tmp[i]);
    parts[n]:= parts[n] + 1;
  end;
  // формируем ответ
  for i:= 1 to 9 do
  case parts[i] of
  0:; // здесь ничего не делаем
  1: begin
       if result = '' then result:= IntToStr(parts[i])
       else result:= result+' * '+IntToStr(i);
     end;
  else begin
         if result = '' then result:= Format('%d^%d',[i,parts[i]])
         else result:= result+' * '+Format('%d^%d',[i,parts[i]]);
       end;
  end;
  Edit2.Text:= result;
end;
если исходной строкой взять, например 2*2*2*2*2*2*2*3*3*5
результат равен 2^7 * 3^2 * 5.
Успехов!

вот рабочий проект
Множители.zip
1
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
03.02.2012, 19:58
Ещё вариант
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{$APPTYPE CONSOLE}
uses
  Windows;
function wsprintfA(Output: PChar; Format: PChar): Integer; cdecl;varargs;external 'user32.dll';
var
  s:     array[0..256] of char ='142=2*2*2*2*2*2*2+3*3+5';
  parts: array[0..9] of LongWord;
  i,j:   LongWord;
begin
  write(s,'=');
  j:=lstrlen(@s)-1;
  for i:=pos('=',s) to j do
    inc(parts[ord(s[i])-48]);
  j:=0;
  for i:=0 to 9 do
    if parts[i]>0 then
    begin
      inc(j,wsprintfA(@s[j],'%i',i));
      if parts[i]>1 then
        inc(j,wsprintfA(@s[j],'^%i',parts[i]));
      s[j]:='+';
      inc(j);
    end;
  s[j-1]:=#0;
  writeln(s);
  readln;
end.
1
0 / 0 / 0
Регистрация: 17.10.2011
Сообщений: 45
04.02.2012, 01:17  [ТС]
Всем спасибо за помощь....Хорошо что есть портал где сидят отзывчивые ребята. Кстати как не пытался использовать ваши функции , не получалось, толи потомучто ламер, толи delphi кривой, хотя нет скорее пока сам не напишешь пару функций не поймешь как ими пользоваться. Поэтому выкладываю свой вариант.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function TForm1.MyReplace(s: string): string;   //функция myreplace
var  i,j,x1,x2,x3: integer; str,str2:string;
begin
for i:=1 to (Length(s) div 2)-1 do begin J:=0;    //максимум проход цикла это
 x1:=pos('*',s);                                 //количество символов /2-1
 delete(s,x1,1);
 insert('/',s,x1);
 x2:=pos('*',s) ;                       //аогоритм несложный ,ищится позиция первого символа*
 x3:=x2-x1;                             //заменяется на '/' дальше находим ЧИСЛО , а не цифру
 str := copy(s, x1+1, x3-1);            //тк оностоит между двумя '*'заносим его в отдельную строку
     repeat                             //ищем его в исходной строке и удаляем + паралельно работает сщетчик
      x2:=pos(str,s);                   // если Число встречается больше чем 1 раз то 'грубо говоря'возводим в степень
       delete(s,x2-1,x3);               //далее избавляемся от ненужной информации занесенной в строку в ходе цикла.
      inc(j);
     until x2=0;
 if j=2 then str2:=str2+str+'*' else
 str2:=str2+str+'^'+inttostr(j-1)+'*';
                                     end;
str2:=StringReplace(str2,'^0*','', [rfReplaceAll, rfIgnoreCase]);
Delete(str2, Length(str2), 1);   //удалим последний символ тк он лишний
result:=str2;
end;
0
 Аватар для Ales'hon'ne
159 / 152 / 50
Регистрация: 03.08.2011
Сообщений: 299
Записей в блоге: 14
05.02.2012, 11:38
Цитата Сообщение от Stani Посмотреть сообщение
на 13 строчке ошибка почемуто, что значит splitstring?
О господи, и её нет!
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
uses
  SysUtils, Types;
 
function StrScan(const Str: PChar; Chr: Char): PChar;
begin
  Result := Str;
  while Result^ <> #0 do
  begin
    if Result^ = Chr then
      Exit;
    Inc(Result);
  end;
  if Chr <> #0 then
    Result := nil;
end;
 
function IsDelimiter(const Delimiters, S: string; Index: Integer): Boolean;
begin
  Result := False;
  if (Index <= 0) or (Index > Length(S)) or (ByteType(S, Index) <> mbSingleByte) then exit;
  Result := StrScan(PChar(Delimiters), S[Index]) <> nil;
end;
 
function FindDelimiter(const Delimiters, S: string; StartIdx: Integer = 1): Integer;
var
  Stop: Boolean;
  Len: Integer;
begin
  Result := 0;
  Len := Length(S);
  Stop := False;
  while (not Stop) and (StartIdx <= Len) do
    if IsDelimiter(Delimiters, S, StartIdx) then
    begin
      Result := StartIdx;
      Stop := True;
    end
    else
      Inc(StartIdx);
end;
 
type
  TStringDynArray=array of string;
 
function SplitString(const S, Delimiters: string): TStringDynArray;
var
  StartIdx: Integer;
  FoundIdx: Integer;
  SplitPoints: Integer;
  CurrentSplit: Integer;
  i: Integer;
begin
  Result := nil;
 
  if S <> '' then
  begin
    { Determine the length of the resulting array }
    SplitPoints := 0;
    for i := 1 to Length(S) do
      if IsDelimiter(Delimiters, S, i) then
        Inc(SplitPoints);
 
    SetLength(Result, SplitPoints + 1);
 
    { Split the string and fill the resulting array }
    StartIdx := 1;
    CurrentSplit := 0;
    repeat
      FoundIdx := FindDelimiter(Delimiters, S, StartIdx);
      if FoundIdx <> 0 then
      begin
        Result[CurrentSplit] := Copy(S, StartIdx, FoundIdx - StartIdx);
        Inc(CurrentSplit);
        StartIdx := FoundIdx + 1;
      end;
    until CurrentSplit = SplitPoints;
 
    // copy the remaining part in case the string does not end in a delimiter
    Result[SplitPoints] := Copy(S, StartIdx, Length(S) - StartIdx + 1);
  end;
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.02.2012, 11:38
Помогаю со студенческими работами здесь

Помогите оптимизировать код
Помогите пожалуйста разобраться, хотелось бы чтобы это прграммка наконец-то заработала. Задача такая: Одномерный массив целых чисел,...

Помогите оптимизировать код
Здравствуйте! Помогите, пожалуйста, оптимизировать его: main.cpp #include &quot;main.h&quot; ...

Помогите оптимизировать код в CodeVisionAVR
Программа для измерения температуры, влажности и давления. void temperature(void) // функция по работе с термо-датчиком { if...

Помогите разобрать и оптимизировать код.
Достался в наследство код. Нет ни задания, ни автора. Нужно заставить работать и подлатать/почистить. Судя по всему, программа призвана в...

Помогите оценить и оптимизировать код до максимальной скорос
Добрый день! Очень нужно достичь максимальной скорости. Готов отдать процессору 100%. Почитал, что DMA все равно делает перекачку...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru