错题1
题目:

如果细心读题,能从题目中读出很多细节。
字宽为2 以及提示中说的-1的情况
其实这道题的难点不在于算法,而在于需要手动写输入。
参考代码:
C风格的:
#include <stdio.h>
#define MAXN 300
int min(int a, int b)
{
return a > b ? b : a;
}
int isChar(unsigned char uc)
{
if ('a' <= uc && uc <= 'z') {
return 1;
}
if ('A' <= uc && uc <= 'Z') {
return 1;
}
return 0;
}
int main(void)
{
unsigned char buf[MAXN];
int len = 0;
int ret;
unsigned int ch;
while (scanf_s("%02x", &ch)) != EOF) {
buf[len++] = (unsigned char)ch;
}
int i;
int type = 0;
for (i = 0; i < 2; i++) {
type = type * 256 + buf[i];
}
unsigned int length = 0;
for (; i < 6; i++) {
length = length * 256 + (unsigned int)buf[i];
}
int count = 0;
if (len - 6 < length) {
count = -1;
} else {
len = min(len, 6 + length);
for (; i < len; i++) {
count += isChar(buf[i]);
}
}
printf("{T:%d,L:%u,V:%d}\n", type, length, count);
return 0;
}
有个用例长度输入的是ff ff ff ff,%d会导致输出-1,不符合预期,需要使用%u。。
考试的时候,如果没有全过,要自己设想一些测试用例,比如边界这些。
C++风格的
using namespace std;
int main()
{
int a, b, c, d, len, num = 0;
cin >> hex >> a >> b;
cout << "{T:" << a * 256 + b;
cin >> hex >> a >> b >> c >> d;
len = ((a * 256 + b) * 256 + c) * 256 + d;
cout << ",L:" << len << ",V:";
if (len < 0 || len > 300) {
cout << -1 << "}\n";
return 0;
}
while (len && cin >> hex >> a) {
num += (a >= int('a') && a <= int('z') || a >= int('A') && a <= int('Z'));
len--;
}
cout << (len ? -1 : num) << "}\n";
return 0;
}

浙公网安备 33010602011771号