|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Разбитие многозначного числа на отдельные цифры
Доброго времени суток.
Суть вопроса такова: Имеется переменная A0, которая равна, например, 63 (положительное, целое). Как разбить данное число на два 6 и 3 и присвоить их переменным A1 и A2? Поиски привели к исходинкам на Паскале: Код:
var s:string; a,t,i,sum:integer; begin sum:=0; readln(a); {ввод числа} str(a,s); {перевод из числа в строку} for i:=1 to length(s) do begin val(s[i],t,err); {перевод i-того символа строки в число} sum:=sum+t; end; writeln(sum); end. Суть ясна, перевод в строчный. Но здесь идет сумма этих цифр, как занести именно в переменные? Да и на Делфи вроде как inttostr используется при переводе в строчное. |
#2
|
|||
|
|||
Есть вараинты.
1. Через строку: Код:
var A : Array Of Integer; S : String; C : Char; InNmb, I, L : Integer; begin InNmb := 63; S :- IntToStr(InNmb); L := Length(S); // инвертрируем строку если нам нужен младший разряд в младшем элементе For I := 1 To (L div 2) Do Begin C := S[i]; S[i] := S[L-I+1]; S[L-I+1] := C; End; // Заполняем массив SetLength(A,L); For I := 1 To L Do A[I-1] := StrToInt(S[i]); end; 2. Через деление Код:
var A : Array Of Integer; InNmb : Integer; begin InNmb := 63; SetLength(A,0); While InNmb > 0 Do Begin SetLength(A,Length(A)+1); A[High(A)] := InNmb mod 10; InNmb := InNmb div 10; End; |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
vers0 (10.07.2019)
|
#3
|
|||
|
|||
Цитата:
Извините, может, будет глупый вопрос, но все же (мало знаком с данной темой): После While InNmb > 0 Do идет деление и соответственно "выяснение" из каких цифр состоит InNmb, а вот как потом разнести эти цифры по переменным A1 и A2? Или строка SetLength(A,Length(A)+1); как раз и заполняет A+1 и т.д.? но тогда в var почему они не обозначены? Последний раз редактировалось vers0, 09.07.2019 в 14:21. |
#4
|
|||
|
|||
Это не строка, а массив. Т.к. заранее не известна длинна числа (кол-во разрядов), я использовал массив для сохранения результатов. Если ты уверен, что будети только 2 разряда, то после цикла можно записать так:
Код:
A1 := A[0]; A2 := A[1]; |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
vers0 (10.07.2019)
|
#5
|
|||
|
|||
Цитата:
Да, количество разрядов будет известно. Спасибо за пример и помощ. |
#6
|
|||
|
|||
Цитата:
Если написать A1 := A[0];, то A1 присваивается сумма двух чисел из которых состоит значение InNmb. Т.е. InNmb=27, а A1=9, при этом A2=48827616 Как присвоить A1=2, а A2=7 ?? Последний раз редактировалось vers0, 20.07.2019 в 16:10. |
#7
|
|||
|
|||
У меня, вроде, все правильно работает.
Только надо инвертировать разряды. Видимо ты пытаешься как-то добраться до массива неправильно, вот и получаешь какой-то мусор. Код:
procedure TForm1.Button1Click(Sender: TObject); var A : Array Of Integer; InNmb : Integer; A1, A2 : Integer; begin InNmb := 27; SetLength(A,0); While InNmb > 0 Do Begin SetLength(A,Length(A)+1); A[High(A)] := InNmb mod 10; InNmb := InNmb div 10; End; A1 := A[1]; A2 := A[0]; ShowMessage(Format('A1=%d, A2=%d',[A1,A2])); end; |