以下是引用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;
}