|
|
发表于 2006-6-24 20:42:12
|
显示全部楼层
题 一:
10 进制数到 16 进制数的经典转换方法就是用长除法, 非常简单, 但依据本题的要求, 难点是如何表示任意大整数及相关运算. 代码如下- #include <stdio.h>
- #include <string.h>
- int mod = 0;
- /* s / 16
- * if result is short than the original s, return 1
- * */
- int div(char s[], int n)
- {
- int i = 0;
- mod = 0;
- for (i = n - 1; i >= 0; i--) {
- int t = ((mod * 10) + s[i]);
- s[i] = t >> 4;
- mod = t & 0x0F;
- }
- if (s[n - 1] != 0) return 0;
- if (s[n - 2] != 0) return 1;
- return 2;
- }
- int main(void)
- {
- char src[1000];
- char dst[1000];
- int src_len = 0;
- int dst_len = 0;
- memset(dst, 0, sizeof(dst));
- printf("input number: ");
- scanf("%s", src);
- src_len = strlen(src);
- int i = 0;
- for (i = (src_len - 1) / 2; i >= 0; i--) {
- int t = src[i] - '0';
- src[i] = src[src_len - i - 1] - '0';
- src[src_len - i - 1] = t;
- }
- while (src_len > 0) {
- src_len -= div(src, src_len);
- dst[dst_len++] = mod;
- }
- printf("result is: ");
- for (i = dst_len - 1; i >= 0; i--) {
- printf("%c", dst[i] > 9 ? dst[i] - 10 + 'A' : dst[i] + '0');
- }
- printf("\n");
- return 0;
- }
复制代码 运行结果- rf@RemoteFish:~/tmp/t$ time ./a.out
- input number: 1234567890987654321234567890987654321234567890987654321
- result is: CE3B5A137DD015278E09864703E4FF9952FF6B62C1CB1
- real 0m17.300s
- user 0m0.000s
- sys 0m0.003s
复制代码 没有严格测试, 求证 |
|