2
#include<iostream>
#include<conio.h>
#include<math.h>
#include<vector>
#include<iterator>
#include<string>
using namespace std;

int main() {
    int k=0;
    string s;

    cout<<"string "; 

    getline(cin,s);             //taking in a string from the user

    float n=s.size();          //storing size of string

    int f=floor((sqrt(n)));   //floor of square root of input string

    int c=ceil((sqrt(n)));    //ceiling 

    int m=f*c;               //storing product of f and c

     vector< vector<string> > vec(n<=m?f:++f, vector<string>(c)); //makes a 2d vector 
                                                                  //depending on user's 
                                                                  //string length


    for(int i=0;n<=m?i<f:i<++f;i++)        //looping acc to user's input and assigning   
    {
        for(int j=0;j<c;j++)           //string to a matrix   
        {
            if(k<s.size())
            {
                vec[i][j]=s[k];
                k++;
            }
        }
    }



    for(int j=0;j<c;j++)        //printing the vector
        {

    {
        for(int i=0;n<=m?i<f:i<++f;i++)

            cout<<vec[i][j];

    }cout<<" ";
        }

getch();         

}

長さ8文字の文字列は2 * 3のベクトルを作成するため、n> mでは機能しません。したがって、文字列全体を行列で囲むことができません。そのため、より大きなサイズのベクトルを作成するために三項を使用していますこのようなケースに遭遇したとき。.だから私は何を間違っていますか?

質問の全文を書きます。

One classic method for composing secret messages is called a square code.  The spaces are removed from the english text and the characters are written into a square (or rectangle). The width and height of the rectangle have the constraint,

    floor(sqrt(word)) <= width, height <= ceil(sqrt(word))

    The coded message is obtained by reading down the columns going left to right. For example, the message above is coded as:

    imtgdvs fearwer mayoogo anouuio ntnnlvt wttddes aohghn sseoau


    Sample Input:

    chillout

    Sample Output:

    clu hlt io
4

1 に答える 1

2

これで問題がすべて解決するわけではありませんが、それでも重要だと感じています。三項式の仕組みを誤解しているようです。ここでその用途の 1 つを観察してみましょう。

for (int i = 0; n <= m ? i < f : i < ++f; i++) {}
//              ^^^^^^^^^^^^^^^^^^^^^^^^  <--- not the intended outcome

これは、3 進数の返された側が所定の位置に「固定」されないため、機能しません。つまり、どちらi < fi < ++ffor ループに直接入れられません。代わりに、valueが返されます。

それが実際に何をしているのかを見るには、最初に、三項式が if-else を行う別の方法であることを理解する必要があります。上記の 3 項を if-else 形式にすると、次のようになります。

if (n <= m)
    i < f;   // left side of the ":"
else
    i < ++f; // right side of the ":"

さらに分解してみましょう。

i < f

これは と のより少ない比較を行ってます。したがって、個々の値に応じて、0 (偽) または 1 (真) のいずれかが返されます。if

したがって、for ループでは、次のようになります。

for (int i = 0; 1; i++) {}
//              ^  <--- if comparison returns true

for (int i = 0; 0; i++) {}
//              ^  <--- if comparison returns false

したがって、あなたの例では、ループのf 前の値を見つける必要があります。その部分に 3 進数を使用できますが、それを理解している場合に限ります。それ以外の場合は、別の方法を使用してf(目的の数値) を見つけます。見つかったら、for ループに入れることができます。i < f

于 2013-10-12T00:20:02.343 に答える