错题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;
}

  

posted @ 2020-03-04 21:51  ren_zhg1992  阅读(194)  评论(0)    收藏  举报