| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 904 人关注过本帖
标题:非常简单的问题 寻求高手方案
取消只看楼主 加入收藏
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
结帖率:99.76%
收藏
已结贴  问题点数:100 回复次数:1 
非常简单的问题 寻求高手方案
比如:

有数组(或者 整数序列) int s[]={1,3,2,4,7};

求在序列1-8中 有哪个数字被遗漏了

我的输出是 :

被遗漏的数据有    5
被遗漏的数据有    6
被遗漏的数据有    8


但是我的代码却是用的比较暴力的枚举办法  很是想知道其他方案
搜索更多相关主题的帖子: 暴力 
2014-06-05 10:42
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用rjsp在2014-6-5 12:27:43的发言:

你用的枚举法,代码差不多如下吧
#include <stdio.h>
#include <malloc.h>

void foo_bitmark( int a, int b, const int s[], size_t n )
{
    unsigned* mark = calloc( ((b+1-a)+sizeof(unsigned)-1)/sizeof(unsigned), sizeof(unsigned) );
    for( size_t i=0; i!=n; ++i )
        mark[ (s-a)/sizeof(unsigned) ] |= 1u << ( (s-a)%sizeof(unsigned) );

    for( size_t i=a; i!=b+1; ++i )
        if( !(mark[(i-a)/sizeof(unsigned)] & (1u<<((i-a)%sizeof(unsigned)))) )
            printf( " %d", i );
    printf( "\n" );
    free( mark );
}

int main()
{
    int s[] = { 1,3,2,4,7 };
    foo_bitmark( 1, 8, s, sizeof(s)/sizeof(s[0]) );

    return 0;
}就是用 bit数组 记录已有的数字。

【如果不开辟数组的话】
如果只缺一个数,找出这个数很简单,用 sigma(a,b) - sum(s)
即,假如一个数都不少,其和当为 (b+a)*(b-a+1)/2
实际和为 s[0]+s[1]+s[2]+ …… + s[n-1]
两者一减就得到那个缺少的数
(虽然还有其它方法,比如不求和,而是求『异或』结果,但本质相同,下面也不再讲)

如果只缺两个数,设这两个数为x和y,则有
x + y = a到b的和 - s的和
x*x + y*y = a到b的平方和 - s的平方和
求解这个方程就得到x和y

如果只缺三个数,设这两个数为x和y和z,则有
x + y = a到b的和 - s的和
x*x + y*y = a到b的平方和 - s的平方和
x*x*x + y*y*y = a到b的令方和 - s的令方和
求解这个方程就得到x、y和z,但已经很难求了

如果只缺四个数,同理,略

具体缺几个数,可以用 n - (b-a+1) 获知

结论是,如果缺一两个数,可以用解方程的手段;如果缺得多,还是暴力枚举最快,代码也最简单。



有位运算的应用资料吗   仅仅知道位运算是咋回事  不会实际应用  正在研究你的代码中。。。。。。。

另附我的代码如下  和你的代码 原理根本就不一样

程序代码:
#include<stdio.h>

void cr(int beg,int end,int s[],int slen)
{
    int i,j;
    bool flag=false;
    for(i=beg;i<=end;i++)
    {
        for(j=0;j<slen;j++)
        {
            if(i==s[j]) 
            {
                flag=true;
                break;
            }
        }
        if(flag==false) printf("被遗漏的数据有 %4d  \n",i);
        flag=false;
    }
    printf("\n");
}

int main()
{
    int s[]={1,3,2,4,7};
    cr(1,8,s,5);
    return 0;
}

DO IT YOURSELF !
2014-06-05 14:48
快速回复:非常简单的问题 寻求高手方案
数据加载中...
 
   



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

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