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();         

}

它不适用于 n>m,因为对于长度为 8 个字符的字符串,它会生成 2*3 的向量,因此无法将整个字符串包含在矩阵中,这就是为什么我使用三元来制作更大尺寸的向量当它遇到这样的情况时。.那么我做错了什么?

我只会写整个问题。

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

这不会解决你的整个问题,但我仍然觉得它很重要。您似乎误解了三元的工作原理。让我们在这里观察它的用途之一:

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

这是行不通的,因为三元的返回侧不会“粘”在原位。换句话说,既不i < f也不i < ++f将直接放入for循环。相反,它会给你一个value

要了解它的实际作用,您首先需要了解三元组只是执行 if-else 的另一种方式。上面的三元,放入 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 之前找到 的值。可以对该部分使用三元组,但前提是您理解它。否则,使用另一种方法来查找f(预期的数值)。一旦找到它,可以放入i < ffor循环。

于 2013-10-12T00:20:02.343 回答