hdu5237
http://acm.hdu.edu.cn/showproblem.php?pid=5237
这是一道单纯的模拟题,首先是对于题意的理解:给一个字符串,求进行k次变换之后该字符串的结果。
每一次的变换方法为:1.将字符串分为没三个字符一组;2.对于一组的每个字符,将其ASCII码值改写为二进制,不够八位的在前面补0(如果每次都对数组清空后从后面填数字,就不必考虑前面加0的情况);3.对于得到的24位数组,将其每6个字符分为一组,每组的6位变换为十进制,每个十进制数字对应一个字符(对应关系用字符串就可以解决);4.按顺序将变换之后得到的字符输出;5.对于字符串长度不能被三整除的,变为二进制后,对于不满八位的地方,在后面补0,剩下的不够四个字符就用等号补满;
理解了题意之后,就是如何清晰地解决问题了。对于这种多步骤的问题,如果用函数的方法就可以让代码更加清晰,修改起来也更方便。

下面附上AC的代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<iostream> 5 #include<cmath> 6 #include<map> 7 #include<queue> 8 using namespace std; 9 int a[32]; 10 char s[99990],ch[99990]; 11 int b[32]; 12 char q[65]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 13 void fun1(int j,char c){ 14 int i,k,m,n; 15 m=(int)c; 16 for(i=j*8+7;i>=j*8;i--){ 17 a[i]=m%2; 18 m/=2; 19 } 20 }//把字母换成二进制 21 int fun2(int j){ 22 int i,k,m,n; 23 for(i=j*6;i<=j*6+5;i++){ 24 if(a[i]!=0) 25 break; 26 } 27 m=0; 28 for(k=i;k<=j*6+5;k++){ 29 m=m*2+a[k]; 30 } 31 return m; 32 }//把24位二进制数字改编为十进制编号 33 void fun(){ 34 int i,j,k,m,n,l,r,z,y; 35 int st=strlen(s); 36 bool flag; 37 char c; 38 l=0; 39 for(i=0;i<st/3;i++){ 40 memset(a,0,sizeof(a)); 41 for(j=0;j<3;j++){ 42 c=s[i*3+j]; 43 fun1(j,c); 44 } 45 for(j=0;j<4;j++){ 46 k=fun2(j); 47 ch[l]=q[k]; 48 l++; 49 } 50 } 51 memset(a,0,sizeof(a)); 52 if(st%3==1){ 53 for(i=0;i<1;i++){ 54 c=s[st/3*3+i]; 55 fun1(i,c); 56 } 57 for(i=0;i<2;i++){ 58 k=fun2(i); 59 ch[l]=q[k]; 60 l++; 61 } 62 ch[l]='='; 63 l++; 64 ch[l]='='; 65 l++; 66 } 67 else if(st%3==2){ 68 for(i=0;i<2;i++){ 69 c=s[st/3*3+i]; 70 fun1(i,c); 71 } 72 for(i=0;i<3;i++){ 73 k=fun2(i); 74 ch[l]=q[k]; 75 l++; 76 } 77 ch[l]='='; 78 l++; 79 } 80 ch[l]='\0'; 81 strcpy(s,ch); 82 }//字符串变换函数 83 int main() 84 { 85 int k,i,j,m,n; 86 int x,y,z; 87 int t,cas; 88 cas=0; 89 scanf("%d",&t); 90 while(t--){ 91 scanf("%d%*c",&k); 92 gets(s); 93 while(k--){ 94 fun(); 95 } 96 cas++; 97 printf("Case #%d: ",cas); 98 printf("%s\n",s); 99 } 100 return 0; 101 }

浙公网安备 33010602011771号