2

理想的には空のセルがないように、n 個の要素からテーブルを作成する最適な方法を探していますが、同時に、テーブルの次元の列/行の比率ができるだけ 1 に近くなります。

もちろん、n が平方数の場合は簡単です。

cols = rows = sqrt( n );

n が素数の場合、空のセルがあることも明らかなので、これを処理する現在の方法は次のとおりです。

rows = floor( sqrt(n) );
cols = ceil( n / rows  );

他のすべてのケースでは、私の計画は、n の素因数を取得し、組み合わせの比率が 1 に最も近いものをすべての可能な順列で検索することです。

私の質問は次のとおりです。これを行うためのより良い方法はありますか? または、少なくとも素因数のすべての可能な組み合わせをテストする必要がない方法はありますか?

4

2 に答える 2

0

同様に何かを実装した方法の擬似コードを次に示します。

int rowCount;
int colCount;

double tempSQR = SquareRoot(cellCount);
int maxRowCount = RoundAwayFromZero(tempSQR);

if(tempSQR == maxRowCount)
{
   rowCount = maxRowCount;
   colCount = rowCount;
}
else if(cellCount is Even)
{
   rowCount = Min(cellCount/2, maxRowCount);
   colCount = RoundAwayFromZero(cellCount/rowCount);
}
else if(cellCount> 1)
{
   rowCount = Min((cellCount+ 1)/2, maxRowCount);
   colCount = RoundAwayFromZero((cellCount+ 1)/rowCount);
}

if(rowCount * colCount < cellCount)
    rowCount++;
于 2010-07-20T15:13:56.467 に答える
0

の素因数分解を行う代わりに、n平方根から始めて、次に大きい (または小さい - 違いはない) 因数を見つけます。その係数のペアは平方根に最も近いため、1:1 の比率に最も近くなります。

于 2010-07-20T15:05:03.457 に答える