首页新闻找找看学习计划

c++ 加密问题

0
悬赏园豆:5 [已解决问题] 解决于 2013-09-23 19:38

描述

让我介绍一种简单的加密方法。
假定这有N字节(1字节=8位)的数据需加密,我们将它分成M字节的组,对最后一组可能要加一些0使它具有M字节,然后我们找出M×M的矩阵(Aij),现在对每一组,假定M字节是X1,X2,…,Xm,我们使用下面的公式产生加密数据Y1,Y2,…,Ym:
Yi=(X1*Ai1)+(X2*Ai2)+…+(Xm*Aim)
i=1,2,3,…,m

输入

这儿有多个用例。
对每个用例的第一行,有两个数N和M(1≤N≤100,2≤M≤10),第二行是N个需加密的数(在0到255之间),然后的M行,每行包含M个数搜索,第i行上的第j个数是Aij(0≤Aij≤255),同一行上的数用空格分开。

输出

对每个用例,输出一行加密的数据,如果加密数据包含K个数,使用K-1个空格来隔开。

样例输入

4 2
1 2 3 4
0 1
1 0
1 2
1
3 1
0 1
10 10
100 100 100 100 100 100 100 100 100 100
100 100 100 100 100 100 100 100 100 100
0 1 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 1

样例输出

2 1 4 3
3 0
100000 100 100 100 100 100 100 100 100 100

怎么wrong 了?
代码:

#include <iostream>
using namespace std;
int main()
{
 int n,m,a[256],b[256][256],i,s[256],j,k,t;
 while(cin>>n>>m)
 { 
 memset(b,0,sizeof(b));
 memset(s,0,sizeof(s));
 memset(a,0,sizeof(a));
 for(i=0;i<n;i++)
 cin>>a[i];
 for(i=0;i<m;i++)
 for(j=0;j<m;j++)
 cin>>b[i][j];
 k=0;t=0;  //将情况分为3种情况   n>m   n<m   n==m;
 if(n>m)
 {
 for(i=n-m;i<n;i++)
 {
 for(j=n-m;j<n;j++)
 {
 b[i][j]=b[k][t++];
 }
 k++;t=0;
 }
 for(i=0;i<n;i++)
 {
 for(j=0;j<n;j++)
 {

 s[i]+=(a[j]*b[i][j]);
 }

 }
 for(i=0;i<n-1;i++)
 cout<<s[i]<<" ";
 cout<<s[i]<<endl;

 }
 else if(n<m)
 {
 for(i=0;i<m;i++)
 for(j=0;j<m;j++)
 s[i]+=(a[j]*b[i][j]);
 for(i=0;i<m-1;i++)
 cout<<s[i]<<" ";
 cout<<s[i]<<endl;

 }
 else
 {
 for(i=0;i<m;i++)
 for(j=0;j<m;j++)
 s[i]+=(a[j]*b[i][j]);
 for(i=0;i<m-1;i++)
 cout<<s[i]<<" ";
 cout<<s[i]<<endl;
 }

 }
 return 0;

}

求解啊。。。

lzyer的主页 lzyer | 初学一级 | 园豆:130
提问于:2013-09-20 11:12
< >
分享
最佳答案
1

看题目意思感觉到是矩阵的乘法。。。结果试了半天,想了半天才想起来矩阵的乘法。。。。给你个测试例子吧。

/*
4 2
1 2 3 4
0 1
1 0
*/

#include <iostream>
#include <cmath>
using namespace std;

int main(int argc, char* argv[]) {
    int N = 4;
    int M = 2;
    int A[2][2] = {{0,1},{1,0}};
    int X[4] = {1,2,3,4};
    int XX[2][2];
    for (int i=0,k=0; i<M; i++) {
        for (int j=0; j<M; j++,k++) {
            XX[i][j] = X[k];
        }
    }
    int YY[2][2];
    for (int i=0; i<M; i++) {
        for (int j=0; j<M; j++) {
            YY[i][j] = 0;
            for (int k=0; k<M; k++) {
                YY[i][j] += XX[i][k]*A[k][j];
            }
            cout << " " << YY[i][j];
        }
    }
    return 0;
}

代码不好解释,我就用例子说明矩阵的乘法吧。

题目意思是先得到MxM的矩阵XX(根据X拆分而来),如X={1,2,3,4},则XX为{{1,2},{3,4}}。

然后输入矩阵MxM的矩阵A为{{0,1},{1,0}}。

YY就是要计算出来的结果:YY=XX*A。

矩阵乘法公式:YY(i,j) = XX(i,0)*A(0,j) + XX(i,1)*A(1,j) + .. XX(i,M-1)*A(M-1)。

最后将YY展开成一维数组Y就是这题目的结果了。。。矩阵乘法公式自己记忆起来的,有问题谷歌查查吧。。。

收获园豆:5
涵曦 | 初学一级 |园豆:65 | 2013-09-23 12:07

YY(0,0) = XX(0,0)*A(0,0) + XX(0,1)*A(1,0) = 1*0+2*1 = 2

YY(0,1) = XX(0,0)*A(0,1) + XX(0,1)*A(1,1) = 1*1+2*0 = 1

YY(1,0) = XX(1,0)*A(0,0) + XX(1,1)*A(1,0) = 3*0+4*1 = 4

YY(1,1) = XX(1,0)*A(0,1) + XX(1,1)*A(1,1) = 3*1+4*0 = 3

涵曦 | 园豆:65 (初学一级) | 2013-09-23 12:25

谢谢。

lzyer | 园豆:130 (初学一级) | 2013-09-23 19:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册