一道华为的笔试题

刚做了一道华为的笔试题,不是很理想,因为审题审了将近半小时,题目写的有点弯弯绕绕的,读了半天才读懂,现把题目附上,希望能给大家一点帮助(博主很不服气,感觉是败在了语文的阅读理解上!!!):
1、题目
对一个数据a进行分类,分类方法为:此数据a(四个字节大小)的四个字节相加 % 一个给定的值,如果得到的结果小于一个给定的值c,则此结果即为数据a的类型;如果得到的结果大于或者等于c,则此结果无效即为数据a的类型无效。

比如一个数据a = 0x01010101,b = 3,按照分类方法计算(0x01 + 0x01 + 0x01 + 0x01)% 3 = 1。所以如果 c = 2,则此a的类型是1,如果c = 1,则此a的类型是无效。

现给定c = 5,b = 2,数据 a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}。计算数据最多的类型(有效类型)有多少个数据。(答案为5)

2、解题
这个题目有点坑,坑就坑在了审题上面,总结来说有以下几点(语文功底不是很好,大概解释一下):
a、给定了一个数字a,我们需要先将数字a转换成十六进制来表示;
b、将十六进制按照两个一组进行叠加;
c、将叠加以后的数字与b求余;
d、将求余以后的结果与c进行比较,如果大于等于c则是一个无效的数字,如果小于c则有效。
e、针对题目中给定的数组a,需要对每一个a中的数字进行步骤a~d的一个计算,分类出求余的结果有多少中,然后统计每一种结果一共有多少个,最后输出最多的那个的数量。

步骤a~d的比较好理解,看题目就能看出来,关键是步骤e,我想了半天,用笔算了半天才理解,我感觉题目说的不清不楚的。

3、代码
现附上我写的C语言代码:

#include 
#include 

int DecToBin(int num)
{
    int num_2 = 0,temp1 = 0,i = 0,temp2 = 1;
    while(num)
    {
        temp1 = num % 2;
        num_2 += temp1 * temp2;
        temp2 = 10 * temp2;
        num /= 2;
    }

    return num_2;
}

int Result(int num)
{
    int temp = 0,temp1[10],i = 0;;
    while(num)
    {
        temp1[i++] = num % 100;
        num /= 100;
    }
    for(int j = 0;j < i;j++)
    {
        temp += temp1[j];
    }

    return temp;
}

int main()
{
    int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int b = 2, c = 5, a1[10], count1 = 0,count2 = 0;

    for(int i = 0;i < 10;i++)
    {
        a[i] = DecToBin(a[i]);
    }

    for(int i = 0;i < 10;i++)
    {
        a1[i] = Result(a[i]);
    }

    for(int i = 0;i < 10;i++)
    {
        if(a1[i] % b == 0)
        {
            count1++;
        }
        else
        {
            count2++;
        }
    }

    if(count1 > count2)
        printf("%d\n",count1);
    else
        printf("%d\n",count2);

    system("pause");

    return 0;
}

你可能感兴趣的:(一道华为的笔试题)