zoj 3713 In 7-bit
刚开始没注意它规定的范围,就是用了位运算。感觉挺好。已提交超时了!回头看它的数组非常大,一个循环内部稍微多几步操作就会超时
#include<stdio.h> #include<string.h> char str[3000006]; int main(int argc, char* argv[]) { int t,i; int len; int pre,later; while(scanf("%d",&t)!=EOF) { getchar(); while(t--) { gets(str); len=strlen(str); do { pre=len>>7; later=len&127; if(pre>0) later=later|128; printf("%02X",later); len=len>>7; }while(pre!=0);/*如果前面还有1就在循环一直到长度的所有值输出完毕 */ for(i=0;i<strlen(str);i++) printf("%02X",str[i]); printf("\n"); } } return 0; }
后来看网上的,确实比我的省时多了
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<time.h> #include<math.h> char str[3000005];/*最高位是22位*/ int bi[100]; int main() { int t,k,b,d,c,i; scanf("%d",&t); getchar(); while(t--) { gets(str); k = strlen(str); b = 2097152,c = 16384 , d= 128;/*高位第22,15,8位*/ if(k >= b)/*最高位21位上是为1*/ { printf("%02X",k%d+d);/*取余加上第8位的1*/ printf("%02X",k%c/d+d); printf("%02X",k%b/c+d); printf("%02X",k/b); } else if(k >= c)/*第二个个高位14位上是为1*/ { printf("%02X",k%d+d); printf("%02X",k%c/d+d); printf("%02X",k/c); } else if(k >= d)/*第7为上位1*/ { printf("%02X",k%d+d); printf("%02X",k/d); } else printf("%02X",k); for(i = 0 ;i < k ;i ++) printf("%02X",str[i]); printf("\n"); } return 0 ; }