某著名公司的一道面试题:
请用C语言将API函数itoa函数重写,并计算复杂度。
我花了半个小时写了一个,欢迎大家批评指正。
itoa.c (时间复杂度 = o(len), len为转换后的字符串长度)
char
*
itoa(
int
value,
char
*
str,
int
radix)
... {
int remainer = value;
int len = 0;
int i = 0;
const char temp[36] = ...{'0', '1', '2', '3',
'4', '5', '6', '7',
'8', '9', 'A', 'B',
'C', 'D', 'E', 'F',
'G', 'H', 'I', 'J',
'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R',
'S', 'T', 'U', 'V',
'W', 'X', 'Y', 'Z'
};
if(str == NULL)
return str;
remainer = value;
//calculate the length of string after value conversion
while((remainer = remainer / radix) != 0)
len++;
//add the prefix of string
//binary: 0B
//octal: 0O
//decimal: 0D
//Hex: 0X
//Other: XX
switch(radix)
...{
case 2:
str[0] = '0';
str[1] = 'B';
break;
case 8:
str[0] = '0';
str[1] = 'O';
break;
case 10:
str[0] = '0';
str[1] = 'D';
break;
case 16:
str[0] = '0';
str[1] = 'X';
break;
default:
str[0] = 'X';
str[1] = 'X';
break;
}
i = 2;
remainer = value;
//data conversion
while((remainer != 0) || (len >= 0))
...{
str[i++] = temp[remainer / (int)(pow(radix, len))];
remainer = value % (int)(pow(radix, len));
len-- ;
}
str[i] = '
... {
int remainer = value;
int len = 0;
int i = 0;
const char temp[36] = ...{'0', '1', '2', '3',
'4', '5', '6', '7',
'8', '9', 'A', 'B',
'C', 'D', 'E', 'F',
'G', 'H', 'I', 'J',
'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R',
'S', 'T', 'U', 'V',
'W', 'X', 'Y', 'Z'
};
if(str == NULL)
return str;
remainer = value;
//calculate the length of string after value conversion
while((remainer = remainer / radix) != 0)
len++;
//add the prefix of string
//binary: 0B
//octal: 0O
//decimal: 0D
//Hex: 0X
//Other: XX
switch(radix)
...{
case 2:
str[0] = '0';
str[1] = 'B';
break;
case 8:
str[0] = '0';
str[1] = 'O';
break;
case 10:
str[0] = '0';
str[1] = 'D';
break;
case 16:
str[0] = '0';
str[1] = 'X';
break;
default:
str[0] = 'X';
str[1] = 'X';
break;
}
i = 2;
remainer = value;
//data conversion
while((remainer != 0) || (len >= 0))
...{
str[i++] = temp[remainer / (int)(pow(radix, len))];
remainer = value % (int)(pow(radix, len));
len-- ;
}
str[i] = '
测试代码如下:
#include
<
math.h
>
#include < stdio.h >
int main( int argc, char * argv[])
... {
int value = 0;
char str[100];
scanf("%d", &value);
while(value != 0)
...{
printf("%d %s ", value, itoa(value, str, 2));
printf("%d %s ", value, itoa(value, str, 8));
printf("%d %s ", value, itoa(value, str, 10));
printf("%d %s ", value, itoa(value, str, 16));
scanf("%d", &value);
}
return 1;
}
#include < stdio.h >
int main( int argc, char * argv[])
... {
int value = 0;
char str[100];
scanf("%d", &value);
while(value != 0)
...{
printf("%d %s ", value, itoa(value, str, 2));
printf("%d %s ", value, itoa(value, str, 8));
printf("%d %s ", value, itoa(value, str, 10));
printf("%d %s ", value, itoa(value, str, 16));
scanf("%d", &value);
}
return 1;
}