编程之美一 旋转的二进制(待确认)

1、http://acm.hdu.edu.cn/contests/contest_showproblem.php?cid=498&pid=1004

2、题目:

旋转的二进制

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2119    Accepted Submission(s): 339


Problem Description
   
   
   
   
给定一个自然数M,及其二进制长度N,得到一个N位的二进制串     b1 b2 ... bN-1 bN 将该串做左旋转,即b1移到bN后面,得到一个新的二进制串:     b2 b3 ... bN-1 bN b1 对新的二进制串再做左旋转,得二进制串     b3 b4 ... bN-1 bN b1 b2 重复旋转操作操作,可得N个二进制串,对这N个串排序,可得一个N*N的矩阵. 例如: 1 0 0 0 1->0 0 0 1 1->0 0 1 1 0->0 1 1 0 0->1 1 0 0 0 对它们做排序,得矩阵
    0   0   0   1   1
    0   0   1   1   0 
    0   1   1   0   0
    1   0   0   0   1  
    1   1   0   0   0  

问:给出一个自然数M,及其二进制长度N,求出排序矩阵的最后一列。
对于上面的例子,给出M=3,N=5,要你的程序输出10010。

补充说明:存在自然数M的二进制表达超过N位的情况,在这种情况下,取前N次循环的二进制串排序后的最后一列即可。
 

Input
   
   
   
   
第一行有一个自然数K,代表有K行测试数据(K<=1000)。 第二行至第K+1行,每行的第一个为自然数M,第二个为二进制长度N(N<64)。
 

Output
   
   
   
   
输出K行,每行N个二进制,表示矩阵最后一列从上到下的二进制。
 

Sample Input
   
   
   
   
3 3 5 4 7 1099512709120 45
 

Sample Output
   
   
   
   
10010 1000000 110000000000000000000000000000100000000000000
3、一开始认为m二进制位数超过n,还是按照超过的计算,后来才知道需要取后n位

改正后待提交的代码:

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int a[205];
string c[205];
unsigned long long m;
int cmp(string b,string d)
{
    return b<d;
}
int main()
{
    int t;
    long long n;
    cin>>t;
    while(t--)
    {
        cin>>n>>m;
        if(m==0)
        cout<<endl;
        else
        {
            int i=0;
        memset(a,0,sizeof(a));
        while(n)
        {
            a[++i]=n%2;
            n/=2;
        }
        int ii=i;
        if(ii<m)
        {
            for(int j=1; j<=m-ii; j++)
            {
                a[i+j]=0;
                i++;
            }
        }
        for(int iii=0; iii<=m; iii++)
            c[iii].clear();
        int k=0,p=0,kk=1;
        for(int j=i; j>=1 && kk<=m; j--)
        {
            kk++;
            c[k]+=(a[j]+'0');
        }
        for(int q=1; q<m; q++)
        {
            char w=c[q-1][0];
            string o=c[q-1];
            o.erase(0,1);
            c[q]+=o;
            c[q]+=w;
        }
        sort(c,c+m,cmp);
//        for(int i=0;i<m;i++)
//        cout<<c[i]<<endl;
        for(int i=0; i<m; i++)
        {
            cout<<c[i][c[i].length()-1];
        }
        cout<<endl;
        }

    }
    return 0;
}
/*
10
3 1
4 1
1 0
0 1
*/


你可能感兴趣的:(编程之美一 旋转的二进制(待确认))