Ваша ошибка в той части, где вы делаете последний перенос из ячеек, в которых есть числа с более чем одной цифрой:
if(res[i] > 9) {
res[i - 1] += (res[i] / 10) % 10; //left-digit
res[i] = res[i] % 10; //right-digit
}
Здесь вы предполагаете, что res[i]
имеет большинство двух цифр (не больше 99). Предположение не обосновано. Я попытался умножить 99 999 999 999 (одиннадцать цифр) на себя, используя вашу программу, и на этом этапе res[12]
содержал 100. Таким образом, (res[i] / 10) % 10
оценивается как 0, и вы не переносите что-либо на res[11]
или res[10]
, как следует.
Полагаю, мне следует оставить это для себя, чтобы найти хорошее решение.
Редактировать: Для удобства чтения это ваше собственное исправление из вашего комментария, отформатированное и с отступом:
for (int i = res.length - 1; i >= 0; i--) {
if (res[i] > 9) {
if (res[i] > 99) {
res[i - 1] += ((res[i] / 100) % 10) * 10; // first digit (*10)
res[i - 1] += (res[i] / 10) % 10; // second digit
} else {
res[i - 1] += (res[i] / 10) % 10; // left-digit
}
res[i] = res[i] % 10; // right-digit
}
}
Вот изящный питонический способ сделать это:
>>> array([[1,2,3],]*3)
array([[1, 2, 3],
[1, 2, 3],
[1, 2, 3]])
>>> array([[1,2,3],]*3).transpose()
array([[1, 1, 1],
[2, 2, 2],
[3, 3, 3]])
проблема с [16]
, похоже, в том, что транспонирование не влияет на массив. вам, вероятно, нужна матрица:
>>> x = array([1,2,3])
>>> x
array([1, 2, 3])
>>> x.transpose()
array([1, 2, 3])
>>> matrix([1,2,3])
matrix([[1, 2, 3]])
>>> matrix([1,2,3]).transpose()
matrix([[1],
[2],
[3]])
Если Вы имеете кадр данных панд и хотите сохранить dtypes, даже categoricals, это - быстрый способ сделать это:
import numpy as np
import pandas as pd
df = pd.DataFrame({1: [1, 2, 3], 2: [4, 5, 6]})
number_repeats = 50
new_df = df.reindex(np.tile(df.index, number_repeats))
Прежде всего, обратите внимание, что с операциями широковещательной передачи numpy обычно не требуется дублировать строки и столбцы. См. Описания this и this .
Но для этого, repeat и newaxis , вероятно, являются лучшим способом
In [12]: x = array([1,2,3])
In [13]: repeat(x[:,newaxis], 3, 1)
Out[13]:
array([[1, 1, 1],
[2, 2, 2],
[3, 3, 3]])
In [14]: repeat(x[newaxis,:], 3, 0)
Out[14]:
array([[1, 2, 3],
[1, 2, 3],
[1, 2, 3]])
Этот пример предназначен для вектора-строки, но, надеюсь, применение его к вектору-столбцу очевидно. Кажется, что повторение хорошо написано, но вы также можете сделать это с помощью умножения, как в вашем примере
In [15]: x = array([[1, 2, 3]]) # note the double brackets
In [16]: (ones((3,1))*x).transpose()
Out[16]:
array([[ 1., 1., 1.],
[ 2., 2., 2.],
[ 3., 3., 3.]])
Используйте numpy.tile
:
>>> tile(array([1,2,3]), (3, 1))
array([[1, 2, 3],
[1, 2, 3],
[1, 2, 3]])
или для повторяющихся столбцов:
>>> tile(array([[1,2,3]]).transpose(), (1, 3))
array([[1, 1, 1],
[2, 2, 2],
[3, 3, 3]])