基本的混淆程序

时间:2013-10-10 15:12:07

标签: c++

#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个字符的字符串,它不适用于n&gt; m,因此它会生成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

1 个答案:

答案 0 :(得分:2)

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

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

这不起作用,因为三元的返回侧“粘贴”本身就位。换句话说,i < fi < ++f都不会直接放入for循环中。相反,它会给你一个

要了解它的确在做什么,您首先需要了解三元是另一种做if-else的方法。上面的三元组,if-else形式,看起来像这样:

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

让我们进一步分解:

i < f

这是if小于比较。因此,根据各个值,您将收到0(假)或1(真)。

因此,在你的for循环中,会发生这种情况:

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

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

因此,对于您的示例,您需要在循环之前找到f 的值。您可以使用该部分的三元组,但前提是您理解它。否则,使用另一种方法查找f(预期的数值)。一旦找到它,然后就可以将i < f放入for循环中。