Удаление одинаковых символов

Задача: 

Оставить в строке только один экземпляр каждого встречающегося символа.

Описание переменных: 

s1 – исходная строка;
s2 – конечная строка;
s3 – переменная для очередного символа.

Алгоритм решения задачи: 
  1. Копировать в s3 очередной символ из s1.
  2. Если s3 не содержится в s2, то добавить его туда.
Программа на языке Паскаль: 

var
    s1,s2,s3: string;
    i: byte;
begin
    write('String: ');
    readln(s1);
    s2 := '';
    for i:=1 to length(s1) do begin
        s3 := copy(s1,i,1);
        if pos(s3,s2) = 0 then
            s2 := s2 + s3
    end;
    writeln('String: ',s2);
readln
end.

Комментарии

Стоит ли преобразовывать?

Задача такая: Дано натуральное число n. Удалить из числа все вхождения тех цифр, которые входят в него ровно 2 раза.
Думаю, что придется преобразовывать в строку, считать вхождения, удалять, а потом обратно в число преобразовать... или нет?

Можно попробовать создать

Можно попробовать создать пару целочисленных массивов. В одном хранить все цифры, которые извлекаются из числа с помощью div и mod. Например, если число 23565, то массив получится [5, 6, 5, 3, 2].
Во втором массиве b хранить счетчики чисел. Для примера выше должно получиться так [0, 0, 1, 1, 0, 2, 1, 0, 0, 0].
Далее проверям счетчик цифры. Если он равен двум, то цифра не участвует в образовании числа.
Первая цифра нового числа умножается на 1, вторая на 10, третья на 100 и т.д. Потребуется еще счетчик и для этого.

Спасибо

Спасибо за решение. Извините, но не поняла, почему получился такой массив b, для Вашего примера я бы решила, что это [2,1,2,1,1]. Дальше проверять счетчик и в каждой итерации умножать на 10 ,там где это нужно, можно сразу сформировать нужное число. Хотя решение с преобразованием в строку мне кажется проще. Объясните в чем преимущества того или иного способа?

В моем варианте массива b

В моем варианте массива b первый элемент обозначает количество нулей, второй кол-во единиц и т.д до 9. Хотя можно и так как у вас.

Если решение с переводом в строку проще, то возможно так и следует решать. Однако бывает в заданиях подобного рода подразумевается именно алгебрарическое решение задачи.

Скорее всего существует способ решения вообще без массивов, но логически более сложный, включающий вложенный цикл.

Помогите разобраться с элементарщиной...

Здраствуйте, есть здача:
"Поменять порядок следования цифр в заданном натуральном числе N на обратный, удалив при этом из записи получаемого числа все вхождения цифры k."
С первой частью се понятно, поменять цифры местами не составляет труда, а вот каким образом удалить цифру из числа не могу понять, ведь это не строковый тип... или все же нужно привести к данному типу...?

удаление цифры из числа

read(a);          {число}
read(k);           {цифра}
m:=1
while a>0  do begin
    c:=a mod 10
    if c<>k then begin
                           b:=b+m*k;
                            m:=m*10;
                          end;
     a:=a div 10; 
end;
write (b);

Процедуры преобразования

Процедуры преобразования числа в строку и наоборот есть: http://pas1.ru/stringfunction (в конце статьи).

Но думаю, это не лучший способ решения этой задачи. Скорее всего, здесь требуется найти какой-нибудь арифметический алгоритм решения.

Что-то типа этого:

x := 148 // заданное число
y := 0 // будущее число-перевертыш
k := 4 // цифра для удаления
Пока x > 0 делать
___ a := x mod 10 := 8 // пишу числа для наглядности
___ x := x div 10 := 14
___ Если a <> k делать
______ y := y * 10 + a := 0 + 8 := 8

Перед второй итерацией цикла переменные выглядят так:
x := 14
y := 8
k := 4
Пока x > 0 делать
___ a := x mod 10 := 4
___ x := x div 10 := 1
___ Если a <> k делать // ложь! у не будет увеличен
______ y := y * 10 + a := 0 + 8 := 8

Третий проход:
x := 1
y := 8
k := 4
Пока x > 0 делать
___ a := x mod 10 := 1
___ x := x div 10 := 0
___ Если a <> k делать
______ y := y * 10 + a := 8 * 10 + 1 := 81