随笔-156  评论-223  文章-30  trackbacks-0
   原题为某游戏公司的试题,大意如下:写一个千位分隔符算法,函数原型是 char * format_thousands_separator(unsigned long val); 要求实现效果是 1.使用者不需要释放返回的字符串指针 2.支持最多调用16次而不返回相同指针地址。可以用以下方法测试       
    printf("num1(%s), num2(%s), num3(%s)\n", format_thousands_separator(0),format_thousands_separator(123456),format_thousands_separator(23456789)); 
   注:要求写出可编译并可以运行通过的程序代码。

   经过修改后,我目前最简洁的C代码描述如下
 1 char* format_thousands_separator(unsigned long  val)
 2 {
 3     static char buf[16][16];
 4     static int  c = 0;
 5 
 6     long m, n = 0;
 7     char* p = &buf[c++ % 16][15];
 8     *= '\0';
 9 
10    do 
11    {
12        m = val % 10;
13        val = val / 10;
14        *--= '0' + m;
15
16        if (val && !(++% 3))
17            *--= ',';
18
19    }
 while(val);
20
21    return p;
22}
   这里再稍作一下扩展,使之能支持负数,代码描述如下
 1char* format_thousands_separator(long  val)
 2 {
 3     static char buf[16][16];
 4     static int  c = 0;
 5 
 6     long m, n = 0;
 7     char* p = &buf[c++ % 16][15];
 8     *= '\0';
 9 
10    do 
11    {
12        m = val % 10;
13        val = val / 10;
14        *--= '0' + (m < 0 ? -m : m);
15
16        if (!val && m < 0
17            *--= '-';
18
19        if (val && !(++% 3))
20            *--= ',';
21    
22    }
 while(val);
23
24    return p;
25}
   如果哪位大侠有更简洁高效的代码,还望留言或Email我,谢谢哈
posted on 2011-06-24 10:55 春秋十二月 阅读(2843) 评论(4)  编辑 收藏 引用 所属分类: Algorithm

评论:
# re: 十进制整数千位分隔符 2011-06-24 17:45 | 4everlove
我认为这段代码有一个问题,unsigned long的最大值为20位,从而有可能的分隔符位数为6,加上一个\0,那么一个数组应该保留27位才可能保证边界安全  回复  更多评论
  
# re: 十进制整数千位分隔符 2011-06-24 20:25 | qinqing1984
@4everlove
呵呵,有道理  回复  更多评论
  
# re: 十进制整数千位分隔符[未登录] 2011-06-29 16:06 | tom
为什么不调用C Runtime比如itoa()之类,然后对字符串进行操作?  回复  更多评论
  
# re: 十进制整数千位分隔符[未登录] 2011-12-06 13:30 | x
这代码虽然实现了,但是有Bug  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理