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
改正后待提交的代码:
#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
*/
本文介绍了一道关于旋转二进制串并排序的问题,通过给出的自然数M及其二进制长度N,生成N个旋转后的二进制串,然后进行排序,最终输出排序后矩阵的最后一列。
&spm=1001.2101.3001.5002&articleId=23603733&d=1&t=3&u=657a141631b445c98d4e6f2bebbf3cda)
1万+

被折叠的 条评论
为什么被折叠?



