数组划分算法

brilliantyoho 2013-10-31 10:52:26
将0一9范围内的double类型数字划分成为4组数,第一组:0一3;第二组:2一5;第三组:4一7;第四组:6一9。每一组和前一组的重叠范围为2。现在任意给定一个数,要求快速判定这个数属于哪一组,例如给定3,则属于第一组和第二组,给定3.1,则属于第二组,怎样解决这个问题?要求不能将给定的数与每一组数的上下界进行对比来进行判断。
...全文
292 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lcmzgy 2013-11-02
  • 打赏
  • 举报
回复
引用 1 楼 lm_whales 的回复:
可以用掩码做:
// 组掩码:
       0~3  mask =1,2~5,mask =2,4~7,mask =8,6~9,mask =16
int mask_range[4] ={1,2,4,8,16}; 
// 数字掩码:    0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9   
int mask_no[10]={1 ,1 ,3 ,3 ,6 ,6 ,12,12,16,16};
int inrange(int n,int group)
{ 
   if(mask_no[n] & mask_range[group])
      regurn 1 ;
   return 0;
}
大约这么处理.
看不懂啊,能不能解释一下啊
水平不流 2013-11-02
  • 打赏
  • 举报
回复
引用 5 楼 lm_whales 的回复:
抱歉 ,掩码写错了: 数字掩码中 某个数字,在哪一组中,该数字个位置上的掩码,就或上那一组的掩码; 因为位互不相同, 所以或,换上加法,结果也是一样 [quote=引用 4 楼 lcmzgy 的回复:] [quote=引用 1 楼 lm_whales 的回复:] 可以用掩码做:
// 组掩码:
       0~3  mask =1,2~5,mask =2,4~7,mask =4,6~9,mask =8
int mask_range[4] ={1,2,4,8}; //这里多了一个16,已经删除。
// 数字掩码,16 是错误的,应该是 8,已经改正。
// 数字掩码:    0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9   
int mask_no[10]={1 ,1 ,3 ,3 ,6 ,6 ,12,12,8,8};
//    0~3        1 ,1 ,1 ,1           
//    2~5              2 ,2 ,2 ,2  
//    4~7                    4 ,4 ,4 ,4
//    6~9                          8  8  8 8
//               
//  1|2 =3  ,2|4 =6 ,4|8 =12 
//  这个函数,可以确定数字 n,是否在group这一组内。 
// mask_no[n] & mask_range[group] =0 ,说明了 ,两个掩码,没有位相同。
// mask_no[n] & mask_range[group] !=0, 说明了 ,两个掩码,有位相同的位。
// 组掩码,只有一个位为1,所以  mask_no[n] & mask_range[group] !=0
// 就代表,n 在group 这一组。 
// mask_no[n] & mask_range[group] =0 ,表示n 不在group 这一组。 
                         
int inrange(int n,int group)
{ 
   if(mask_no[n] & mask_range[group])  // 这个检测数字 n的数字掩码。是否包含group的掩码
      regurn 1 ;
   return 0;
}
大约这么处理.
看不懂啊,能不能解释一下啊[/quote] [/quote] 赞一个。
lcmzgy 2013-11-02
  • 打赏
  • 举报
回复
引用 5 楼 lm_whales 的回复:
抱歉 ,掩码写错了: 数字掩码中 某个数字,在哪一组中,该数字个位置上的掩码,就或上那一组的掩码; 因为位互不相同, 所以或,换上加法,结果也是一样 [quote=引用 4 楼 lcmzgy 的回复:] [quote=引用 1 楼 lm_whales 的回复:] 可以用掩码做:
// 组掩码:
       0~3  mask =1,2~5,mask =2,4~7,mask =4,6~9,mask =8
int mask_range[4] ={1,2,4,8}; //这里多了一个16,已经删除。
// 数字掩码,16 是错误的,应该是 8,已经改正。
// 数字掩码:    0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9   
int mask_no[10]={1 ,1 ,3 ,3 ,6 ,6 ,12,12,8,8};
//    0~3        1 ,1 ,1 ,1           
//    2~5              2 ,2 ,2 ,2  
//    4~7                    4 ,4 ,4 ,4
//    6~9                          8  8  8 8
//               
//  1|2 =3  ,2|4 =6 ,4|8 =12 
//  这个函数,可以确定数字 n,是否在group这一组内。 
// mask_no[n] & mask_range[group] =0 ,说明了 ,两个掩码,没有位相同。
// mask_no[n] & mask_range[group] !=0, 说明了 ,两个掩码,有位相同的位。
// 组掩码,只有一个位为1,所以  mask_no[n] & mask_range[group] !=0
// 就代表,n 在group 这一组。 
// mask_no[n] & mask_range[group] =0 ,表示n 不在group 这一组。 
                         
int inrange(int n,int group)
{ 
   if(mask_no[n] & mask_range[group])  // 这个检测数字 n的数字掩码。是否包含group的掩码
      regurn 1 ;
   return 0;
}
大约这么处理.
看不懂啊,能不能解释一下啊[/quote] [/quote] 谢谢,懂了,
lm_whales 2013-11-02
  • 打赏
  • 举报
回复
另外的处理方式 1)用一个二维数组,表示某个数在那一组 //1 表示在组内,0表示不在组内。
int group_tab[10][4]=
{
//组0~3,2~5,4~7,6~9 ,//数字  
   {  1,  0,  0,  0},//0 
   {  1,  0,  0,  0},//1
   {  1,  1,  0,  0},//2 
   {  1,  1,  0,  0},//3  
   {  0,  1,  1,  0},//4 
   {  0,  1,  1,  0},//5 
   {  0,  0,  1,  1},//6 
   {  0,  0,  1,  1},//7 
   {  0,  0,  0,  1},//8 
   {  0,  0,  0,  1},//9
};

int inrange(int n,int group)
{ 
   return group_tab[n][group])  // 
}
lm_whales 2013-11-02
  • 打赏
  • 举报
回复
抱歉 ,掩码写错了: 数字掩码中 某个数字,在哪一组中,该数字个位置上的掩码,就或上那一组的掩码; 因为位互不相同, 所以或,换上加法,结果也是一样
引用 4 楼 lcmzgy 的回复:
[quote=引用 1 楼 lm_whales 的回复:] 可以用掩码做:
// 组掩码:
       0~3  mask =1,2~5,mask =2,4~7,mask =4,6~9,mask =8
int mask_range[4] ={1,2,4,8}; //这里多了一个16,已经删除。
// 数字掩码,16 是错误的,应该是 8,已经改正。
// 数字掩码:    0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9   
int mask_no[10]={1 ,1 ,3 ,3 ,6 ,6 ,12,12,8,8};
//    0~3        1 ,1 ,1 ,1           
//    2~5              2 ,2 ,2 ,2  
//    4~7                    4 ,4 ,4 ,4
//    6~9                          8  8  8 8
//               
//  1|2 =3  ,2|4 =6 ,4|8 =12 
//  这个函数,可以确定数字 n,是否在group这一组内。 
// mask_no[n] & mask_range[group] =0 ,说明了 ,两个掩码,没有位相同。
// mask_no[n] & mask_range[group] !=0, 说明了 ,两个掩码,有位相同的位。
// 组掩码,只有一个位为1,所以  mask_no[n] & mask_range[group] !=0
// 就代表,n 在group 这一组。 
// mask_no[n] & mask_range[group] =0 ,表示n 不在group 这一组。 
                         
int inrange(int n,int group)
{ 
   if(mask_no[n] & mask_range[group])  // 这个检测数字 n的数字掩码。是否包含group的掩码
      regurn 1 ;
   return 0;
}
大约这么处理.
看不懂啊,能不能解释一下啊[/quote]
lcmzgy 2013-11-01
  • 打赏
  • 举报
回复
mark,学习一下
图灵狗 2013-11-01
  • 打赏
  • 举报
回复
++
引用 1 楼 lm_whales 的回复:
可以用掩码做:
// 组掩码:
       0~3  mask =1,2~5,mask =2,4~7,mask =8,6~9,mask =16
int mask_range[4] ={1,2,4,8,16}; 
// 数字掩码:    0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9   
int mask_no[10]={1 ,1 ,3 ,3 ,6 ,6 ,12,12,16,16};
int inrange(int n,int group)
{ 
   if(mask_no[n] & mask_range[group])
      regurn 1 ;
   return 0;
}
大约这么处理.
lm_whales 2013-11-01
  • 打赏
  • 举报
回复
可以用掩码做:
// 组掩码:
       0~3  mask =1,2~5,mask =2,4~7,mask =8,6~9,mask =16
int mask_range[4] ={1,2,4,8,16}; 
// 数字掩码:    0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9   
int mask_no[10]={1 ,1 ,3 ,3 ,6 ,6 ,12,12,16,16};
int inrange(int n,int group)
{ 
   if(mask_no[n] & mask_range[group])
      regurn 1 ;
   return 0;
}
大约这么处理.

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧