| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3308 人关注过本帖
标题:C语言区间计算
只看楼主 加入收藏
zhaozilong
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-4-8
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
C语言区间计算
挺简单的功能:允许两个操作,add(min,max)和del(min,max),一开始区间内为空,每个操作后算出区间内的集合,要求能自动合并、拆分集合。例如:   
  操作1:add(1,7)       区间内的集合:(1,7)   
  操作2:add(9,10)     区间内的集合:(1,7)、(9,10)   
  操作3:del(3,5)       区间内的集合:(1,2)、(6,7)、(9,10)   
  操作4:add(3,8)       区间内的集合:(1,10)   
  整个区间的值可能会在(1,2^30)之间,所以不能用“位的与、或”来表示区间有效值的算法。

最好有C源码!
搜索更多相关主题的帖子: C语言 
2010-04-09 17:28
zhangbohtz
Rank: 2
等 级:论坛游民
帖 子:36
专家分:39
注 册:2010-1-29
收藏
得分:0 
首先你的函数定义是有问题的 如 add(min, max),操作一是可以,操作2呢,他的有个参数比较之前的数据,只有增加参数才能实现功能!
2010-04-09 18:57
zhangbohtz
Rank: 2
等 级:论坛游民
帖 子:36
专家分:39
注 册:2010-1-29
收藏
得分:0 
我是个菜鸟,感觉应该动态的分配空间,条件判断过多,又没太多时间....爱莫能助!
2010-04-09 19:08
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:20 
一个普通简单的写法,也比较笨的,用位数组来标志元素。
要算到2^30次方,空间太浪费。如果非要用add(min,max),把p设成全局的
程序代码:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
struct s
{
    unsigned char t:1;
};
void Add(struct s *p,int v1,int v2)
{
    int i=0;
    while(i++<v1) p++;
    while(v1<v2)
    {
        p->t=1;
        v1++;p++;
    }
}
void Delete(struct s *p,int v1,int v2)
{
    int i=0;
    while(i++<v1) p++;
    while(v1<=v2)
    {
        p->t=0;
        v1++;p++;
    }
}
void print(struct s *p,int len)
{
    int i=0;
    while(i<len)
    {
        int t=i;
        while(i<len && p->t==1)
        {
            i++;
            p++;
        }
        if((p-1)->t==1) printf("(%d,%d)",t,i<len?i-1:i);
        i++;p++;
    }
}
int main()
{
    int len=(int)pow(2,30)/8;
    struct s *p=(struct s*)malloc(len);
    if(p==NULL)
    {
        printf("memory error\n");
        return 1;
    }
    memset(p,0,len);
    int v1,v2;
    while(1)
    {
        printf("1: add(),2: delete(),3  break;\n");
        int num;
        puts("select:");
        scanf("%d",&num);
        if(num==3) break;
           puts("input the range:");
        scanf("%d%d",&v1,&v2);
        switch(num)
        {
            case 1:Add(p,v1,v2);break;
            case 2:Delete(p,v1,v2);break;
        }
    }
    puts("print:");
    print(p,len);
    free(p);
    return 0;
}



离恨恰如春草,更行更远还生。
2010-04-09 20:45
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:0 
给出另一个想法。
    用普通整形数组就行,可以动态增长。
    若增加元素,遍历数组若v1,v2都位于两个相邻的数之间,无操作返回
    若不在,则按升序插入。有一个也插入
    若删除元素,同样遍历数组,若v1,v2位于相邻的两个数之间, 两个数
    减1后插入数组,若其中一个在则删除位于v1,v2之间的元素,两数减1
    后插入数组中。
    大致思想是这样了,没试验LZ有兴趣可以实现下,看看行不行。
    输出时,每相邻两个数表示一个范围,

离恨恰如春草,更行更远还生。
2010-04-09 20:51
zhaozilong
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-4-8
收藏
得分:0 
嗯..谢谢!第二个想法,我去试验一下.
2010-04-10 12:51
lyb151
Rank: 1
等 级:新手上路
帖 子:35
专家分:0
注 册:2010-2-6
收藏
得分:0 
太茫然了。。。。
2010-04-10 17:57
continue24
Rank: 2
等 级:论坛游民
帖 子:38
专家分:96
注 册:2012-11-16
收藏
得分:0 
有点小伤心

一直想要成长着……
2012-11-30 22:48
快速回复:C语言区间计算
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017039 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved