2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1 ... 53, 54, 55, 56, 57

А вам пакет PARI/GP интересен?
Да 83%  83%  [ 59 ]
Нет 6%  6%  [ 4 ]
Не уверен(а) 11%  11%  [ 8 ]
Всего голосов : 71
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение02.09.2025, 12:13 
Аватара пользователя
Вопрос по форматам вывода.
Возникла необходимость отделять запятой последние n цифр целого числа. Я попробовал
gp > n=3; m=123456070; printf("%d,%03d\n",m\10^n,m%10^n)
123456,070

учитывая возможные нули в конечной части. Но беда в том, что количество отделяемых цифр меняется в непредсказуемых пределах. Вернее, оно каждый раз определяется n=...
Пробовал через digits, но затык с нулями или получается слишком сложно. :facepalm:

Dmitriy40, спасибо! И ведь смотрел в ЮГ, но не увидел :oops:
(13:00) gp > n1=3;n2=5; m=347005494990070;
printf("%d: %d,%0*d,%0*d\n",m,m\10^(n1+n2),n1,(m%10^(n1+n2))\10^n2,n2,(m%10^(n1+n2))%10^n2)

347005494990070: 3470054,949,90070

(13:02) gp > n1=5;n2=3; m=347005494990070;
printf("%d: %d,%0*d,%0*d\n",m,m\10^(n1+n2),n1,(m%10^(n1+n2))\10^n2,n2,(m%10^(n1+n2))%10^n2)

347005494990070: 3470054,94990,070


Получается! :D

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение02.09.2025, 12:19 
gris в сообщении #1700517 писал(а):
Но беда в том, что количество отделяемых цифр меняется в непредсказуемых пределах. Вернее, оно каждый раз определяется n=...
? n=4; m=123456070; printf("%d,%0*d\n",m\10^n,n,m%10^n)
12345,6070

Т.е. почти любое число в формате можно заменить на переменную, указав вместо него символ "*".
Цитата со 109 страницы Users' Guide to PARI/GP:
Код:
\\ min field width and precision given by arguments
? x = 23; y=-1/x; printf("x=%+06.2f y=%+0*.*f\n", x, 6, 2, y);
x=+23.00 y=-00.04
\\ minimum fields width 5, pad left with zeroes
? for (i = 2, 5, printf("%05d\n", 10^i))
00100
01000
10000
100000 \\ don’t truncate fields whose length is larger than the minimum width


gris в сообщении #1700517 писал(а):
(m%10^(n1+n2))%10^n2
Первый % тут лишний, достаточно лишь второго (точнее наименьшего из всех), %10^n2.

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение02.09.2025, 13:24 
gris в сообщении #1700517 писал(а):
Пробовал через digits, но затык с нулями или получается слишком сложно.

Код:
? formstr(n,m)=my(v=Vec(strexpand(m)),s=strjoin([concat(v[1..n+1]),concat(v[md-n+1..md])],","));return(s);
? formstr(4,123456070)
%1 = "12345,6070"

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение02.09.2025, 14:32 
wrest в сообщении #1700524 писал(а):
? formstr(n,m)=my(v=Vec(strexpand(m)),s=strjoin([concat(v[1..n+1]),concat(v[md-n+1..md])],","));return(s);

Правильно (md у меня было как md=#v):
Код:
formstr(n,m)=my(v=Vec(strexpand(m)),s=strjoin([concat(v[1..n+1]),concat(v[#v-n+1..#v])],","));return(s)

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение02.09.2025, 20:23 
Задаём вектор, где элементы - сколько отделить цифр справа, потом сколько отделть ещё и т.п.
Код:
format_str2(n,v)=my(l=List(Vec(strexpand(n))));for(i=1,#v,listinsert(l,",",#l+2-i-sum(j=1,i,v[j])));return(concat(l))

Пример. В числе n=123456070 справа отделяем 4 цифры, затем 3
Код:
? format_str2(123456070,[4,3])
%1 = "12,345,6070"

Отделяем 3 цифры, затем 2, затем 1:
Код:
? format_str2(123456070,[3,2,1])
%1 = "123,4,56,070"

 
 
 [ Сообщений: 845 ]  На страницу Пред.  1 ... 53, 54, 55, 56, 57


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group