0

私はアルゴリズムの問​​題を解決しようとしましたが、私は初心者であり、プログラミングの問題で多くの練習をしようとしています. そこで、単位行列 n*n を作成したいと思いました。私は愚かな解決策を思いつきました。それは 4*4 マトリックスでは機能しましたが、5*5 では機能しませんでした。私はそれを見たとき、その奇妙な解決策と問題の解決策が本当に簡単であることを知っています. 学ぶことができるように、自分が何を間違えたのかを知る必要があります。私の解決策は本当にばかげていて、そのような問題を解決するために多くの作業を行った後、将来はより良くなるでしょうか?

#include <iostream>
#include <vector>
#include <sstream>
#include <iomanip>  // for setw, setfill

using namespace std;

int binary(int number);

int main()
{

    vector<vector<int> > matrix;

    cout<<"Please enter the size of the identity matrix"<<endl;
    int n;
    cin>>n;

    matrix.resize(n);
    for (int i=0; i<n;i++)
    {

        matrix[i].resize(n);
    }

    int steps = 1<<n-1;

    int bin  = binary(steps);
    ostringstream binString;

    binString <<bin;
    if(binString.str().size()<n)
    {
        std::string dest = binString.str();
        int nPaddings = n-binString.str().size();
        if (nPaddings==0) nPaddings=1;
        dest = std::string( nPaddings, '0').append( binString.str());
        binString.str("");
        binString<<dest;
    }
    for (int col = 0; col<n; col++)
    {
        if(col>=1)
        {
            steps= (int)steps/2;
            int bin = binary(steps);
            binString.str("");
            binString << bin;
            if(binString.str().size()<n)
            {
                std::string dest = binString.str();
                int nPaddings = n-steps;
                if (nPaddings==0) nPaddings=1;
                dest = std::string( nPaddings, '0').append( binString.str());
                binString.str("");
                binString<<dest;
            }
        }
        for (int row=0; row<n; row++)
        {
            matrix[col][row] =binString.str().at(row)-'0';
        }
    }


    return 0;
}

int binary(int number) {
    long rem,i=1,sum=0;
    do
    {
        rem=number%2;
        sum=sum + (i*rem);
        number=number/2;
        i=i*10;
    }while(number>0);

    return sum;
}
4

2 に答える 2

3
#include <iostream>
#include <vector>
using namespace std;

vector<vector<int> > make_idty_matrix( int n )
{
    vector<vector<int> > idty( n, vector<int>( n, 0 ));
    for( int i = 0; i < n; ++i )
        idty[i][i] = 1;
    return idty;
}

int main()
{
    vector<vector<int> > matrix = make_idty_matrix( 5 );

    // your code here
    // ...

    return 0;
}
于 2012-12-17T20:23:05.963 に答える
3

もっと簡単な方法があります。

まず、指定されたサイズで行列を割り当てる必要があります。次に、対角線のみが1sであることがわかります。

vector<vector<int> > matrix;
int n;

cout << "Please enter the size of the identity matrix" << endl;
cin >> n;

// Initialize the matrix as a n x n array of 0.
matrix = vector<vector<int> >(n, vector<int>(n,0));

// Set the diagonal to be 1s
for(unsigned int t = 0; t < n; t++)
    matrix[t][t] = 1;

ここで実際の例を見ることができます。

編集:

エラーは次の行から発生します。

int nPaddings = n-steps;

実際、パディングの計算に のサイズを使用していませんがdest、これは正しくありません。hereを参照してください。変数の状態を確認するために、いくつかのデバッグ printfs を追加しました。nPaddings == -3そのため、エラーが表示されます。

あなたが持っているアイデア:

for each column
    get the representation of the column as a string
    set the i-th value of the column as the i-th character of the string

だから、ここにあなたのアイデアを使ったもっと簡単なプログラムがあります。コードをいくつかの関数に分けると、非常に役立ちます。また、ここstd::ostringstreamstd::stringは純粋にやり過ぎです。

#include <iostream>
#include <vector>
#include <iomanip>  // for setw, setfill

using namespace std;
std::string binStr(unsigned int exponent, unsigned int size);

int main()
{

    vector<vector<int> > matrix;

    cout<<"Please enter the size of the identity matrix"<<endl;
    int n;
    cin>>n;

// Initialize the matrix
    matrix.resize(n);
    for (int i=0; i<n;i++)
        matrix[i].resize(n);

// Fill the matrix
    for (int col = 0; col<n; col++)
    {
        std::string bin = binStr(n-col,n);
        for (int row=0; row<n; row++)
            matrix[col][row] = bin[row]-'0';
    }


// Print the matrix and return
    for(unsigned int y = 0; y < n; y++)
    {
        for(unsigned int x = 0; x < n; x++)
            cout << "\t" << matrix[y][x];
        cout << "\n";
    }
    return 0;
}

std::string binStr(unsigned int exponent, unsigned int size)
{
    // You do not need a string stream (which is like using a bazooka to kill a fly...)
    // Instead, just create a string of the required length
    // 'str' will contain the binary representation of 2^exponent
    std::string str(size,'0');
    if(exponent <= size && exponent > 0)
        str[size - exponent] = '1';
    return str;
}

ここで実際の動作を見ることができます。

于 2012-12-17T20:09:54.480 に答える