今天在网上看到了几道华为的上机题目,题目描述进行了简化,题目原意没有改变。如果发现错误欢迎大家一起讨论交流。
1. 给定一个字符串,把字符串内的字母转换成该字母的下一个字母,a换成b,z换成a,Z换成A。如aBf转换成bCg,字符串内的其他字符不改变。
函数原型:void StringChange(const char *input, char *output);
input:输入字符串,output:输出字符串
void StringChange (const char *input, char *output)
{
while(*input)
{
if(*input >= 'a' && *input <= 'z')
{
*output = *input + 1;
if(*output > 'z')
*output = 'a';
}
else if(*input >= 'A' && *input <= 'Z')
{
*output = *input + 1;
if(*output > 'Z')
*output = 'A';
}
else
*output = *input;
++input;
++output;
}
*output = '\0';
}
2. 求一个整数中有没有相同的部分,例如12389756123这个整数中相同的部分是123,相同的部分至少应该是2位数,如果有相同部分返回1,如果没有则返回0。
函数原型:int same(int num);
注释:给出的测试用例超出了int的表示范围
int same(int num)
{
char ca[20], *p, *q;
itoa(num, ca, 10);
p = ca;
while(*p)
{
q = p + 1;
while(*q)
{
if(*p == *q && *(p+1) == *(q+1))
return 1;
q++;
}
p++;
}
return 0;
}
3. 求两个字符串的乘积。
例如:输入“123”,“456”,输出“56088”
函数原型: void longmulti(const char *a, int len_a, const char *b, int len_b, char *c) ;
void longmulti(const char *a, int len_a, const char *b, int len_b, char *c)
{
int i, j, k, n, carry;
i = j = k = 0;
//如果a,b中有一个是0,则整个运算的结果为0
if(!strcmp(a, "0") || !strcmp(b, "0"))
{
c[0] = '0';
c[1] = '\0';
return;
}
//判断运算结果的正负号
if(a[0] == '-')
{
i = 1;
k = !k;
}
if(b[0] == '-')
{
j = 1;
k = !k;
}
//如果出现了符号,先将符号过滤掉
if(i || j)
{
if(k)
c[0] = '-';
longmulti(a+i, len_a - i, b+j, len_b-j, c+k);
return;
}
memset(c, '0', len_a + len_b);
c[len_a + len_b] = '\0';
//各位数的运算
#define I(a) (a - '0')
for(i = len_a - 1; i >= 0; i--)
{
for(j = len_b - 1, k = i+j+1, carry = 0; j >= 0; j--, k--)
{
n = I(a[i]) * I(b[j]) + I(c[k]) + carry;
c[k] = (n % 10) + '0';
carry = n / 10;
}
c[k] += carry;
}
#undef I
if(c[0] == '0')
memmove(c, c+1, len_a + len_b);
}