整体题目属于那种题目描述冗繁,但其实解法很暴力。
1.ZOJ3708 《行车路线/公交车数目》 题意理解问题,囧,坑了队友。
2.ZOJ3710 《会发展的朋友关系》 暴力搜索,结束的条件挺好,看题目时限直接暴力。while(1) {num=0;........if(num!=0) break;}
3.ZOJ3713 《7 bit》 这题自己必重新过一遍,注意一下细节,也强化一下自己关于ASCAL码及hex的了解。
现在终于看明白了。
先打印长度,以长度为前缀,length_prefixed; 然后再是逐个打印每个字符的hex;
长度(转化为二进制后)超过7个的时候,前面要加1补在最左位,而后右移7位(一开始就是这地方不明白~~囧~~),不断的右移7位直到7位能存下,并且到最后还得把剩下的二进制数转化为hex输出。
输出长度的规则是 先输出长度的二进制数的后七位的十六进制(如果左边还有1 则这在后七位前面加上个1再输出 然后二进制数右移动七位,直到左边没有1) 注:所有16数都必须为两位!
ps:gets读到回车结束。
附代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s[3000010];
int main()
{
int t,i;
scanf("%d",&t);
getchar();
while(t--)
{
gets(s);
int len=strlen(s);
printf("%d\n",len);
if(len==0)printf("00\n"); //不可忽视的一个环节
else
{
int temp=len;
while(temp)
{
if(temp>=128)
{
printf("%02X",temp%128+128);//02X是保留两位对吧
temp/=128;
}
else
{
printf("%02X",temp);
break;
}
}
for(i=0;i<len;i++)printf("%02X",s[i]);
printf("\n");
}
}
return 0;
}
printf("%02X",temp%128+128);//02X是保留两位对吧
temp/=128;
这几步异常重要哦,自己可以结合十进制的移位来记。56除以10只剩5;
通过二进制位数可想明显其中道理,必劳记!
另一
- while(1)
- {
- printf("%02X",(len&127)+(len>127?128:0));
- len>>=7;
- if(len==0) break;
- }