Board logo

标题: 出道编程题,有兴趣的做一下 [打印本页]

作者: zeus    时间: 2005-2-2 10:03     标题: 出道编程题,有兴趣的做一下

已知一个int型数组USER[30],其中每一个元素或为0或是其下标数加1。要求以字符串形式打印其中不为零的元素。
规则:1)不连续元素以逗号分割如:1,4,6,27,30
         2)连续元素用连字符形式,并用逗号分割每个区段,如:1-4,7,19-30
示例数组:USER[30] = {0,0,3,0,5,0,7,8,9,10,11,12,0,0,0,0,0,0,0,0,0,0,0,24,25,0,0,0,29,0}
写出算法或程序。


这是一个function中的一小部分功能实现
作者: zeus    时间: 2005-2-3 10:50

呵呵
这是我工作以后解决的第一个问题的一小部分抽象出来的一个问题
作者: 怀恋在子夜    时间: 2005-2-22 18:42

回去想想
作者: Webmaster    时间: 2005-2-24 11:04

void function()
{
        int nCon=0;//是否连续,>=2连续.<2不连续
        bool bfirst=true;//是否第一次打印。
        for(int i=0;i<30;i++){
                if(0==USER){
                        if(nCon!=0){//存在非0元素                               
                                if(!bfirst){
                                        printf(",");//非第一次打印,打印逗号,否则不打印.
                                }
                                bfirst=false;
                        }
                        if(nCon>=2){
                                printf("%d",i+1-nCon);//min
                                printf("-%d",i);//连续,当前元素为0,打印前一元素(max)
                        }
                        if(nCon==1){
                                printf("%d",i);//不连续,当前元素为0,打印前一元素。
                        }
                        nCon=0;
                }else{
                        nCon++;
                }
        }
        printf("\n");
}

[ Last edited by Webmaster on 2005-2-24 at 11:08 ]
作者: zeus    时间: 2005-2-24 13:00

还好

看了一下, 如果最后一个元素不为0 ,你怎么处理, 考虑一下边界条件

还有 应该是(0==USER[i]) 吧
作者: Webmaster    时间: 2005-2-24 14:06

呵呵,真没考虑最后一个不为0.
改一下吧.
if(0==USER[i]){
//....
}else{
    nCon++;
    if(29==i){//最后不为0,i为当前max位,值为i+1
        printf(",");
        if(nCon>1){
                        printf("%d",i+1+1-nCon);//min
                printf("-%d",i+1);//max
    }else{
                printf("%d",i+1);
    }
}
作者: Webmaster    时间: 2005-2-24 14:08

我怎么感觉我写的这么麻烦呢?
要是能这样就好了:
lsakdjflsa d
asdfjkl;asdj
ok
bye
呵呵。
作者: Webmaster    时间: 2005-2-24 14:15

合起来.
  1. void function()
  2. {
  3.         int nCon=0;//是否连续,>=2连续.<2不连续
  4.         bool bfirst=true;//是否第一次打印。
  5.         for(int i=0;i<30;i++){
  6.                 if(0==USER[i]){
  7.                         if(nCon!=0){//存在非0元素                                
  8.                                 if(!bfirst){
  9.                                         printf(",");//非第一次打印,打印逗号,否则不打印.
  10.                                 }
  11.                                 bfirst=false;
  12.                         }
  13.                         if(nCon>=2){
  14.                                 printf("%d",i+1-nCon);//min
  15.                                 printf("-%d",i);//连续,当前元素为0,打印前一元素(max)
  16.                         }
  17.                         if(nCon==1){
  18.                                 printf("%d",i);//不连续,当前元素为0,打印前一元素。
  19.                         }
  20.                         nCon=0;
  21.                 }else{
  22.                         nCon++;
  23.                         if(29==i){//最后不为0,i为当前max位,值为i+1
  24.                                 printf(",");
  25.                                 if(nCon>1){//连续
  26.                                         printf("%d",i+1+1-nCon);//min
  27.                                         printf("-%d",i+1);//max
  28.                                 }else{
  29.                                         printf("%d",i+1);
  30.                                 }
  31.                                 
  32.                         }
  33.                 }
  34.         }
  35.         printf("\n");
  36. }
复制代码
欢迎大家批评指正.

[ Last edited by Webmaster on 2005-2-24 at 14:21 ]
作者: Webmaster    时间: 2005-2-24 17:40

没反映了?我怎么感觉我在帮人家做作业啊?
作者: zeus    时间: 2005-2-24 21:01

怎么没考虑用指针做呢
这可是c语言的精髓的一部分呀
作者: Webmaster    时间: 2005-2-25 08:37

你用指针做吧.
因为容易出现内存泄露和访问非法地址的原因,我习惯了能不用指针就不用指针。
指针是个很好的方式,但用不好也会造成很大的麻烦。
作者: zeus    时间: 2005-2-25 09:08

你只是听说把
可能还没体验过什么叫内存泄露
几千甚至几万行的程序可能还感觉不到内存泄露
这样的问题往往在大的project中才会出现
况且 现在已经有检测程序代码是否存在内存泄露的工具
呵呵
不必担心
作者: Webmaster    时间: 2005-2-25 09:24

呵呵.你知我干嘛的?
作者: zeus    时间: 2005-2-25 09:38

斑竹阿
呵呵
作者: Webmaster    时间: 2005-2-25 11:22

哈哈
你怎么不用指针做呢?我看看。
作者: casta1985    时间: 2005-2-26 10:35

哇,看两个高人讨论那么深奥的问题,好崇拜啊,我很努力的学,C语言仍然只是学到皮毛而已,惭愧啊
作者: Webmaster    时间: 2005-2-28 13:36

楼上,你挖苦我们呢?不就是一个小题目大家玩玩么。




欢迎光临 工程家园 (http://heubbs.com./) Powered by Discuz! 7.2