反清复明 http://xupeng.
解题方法:
首先对13个球标号并分组:
1、 2、 3、 4 A1组
5、 6、 7、 8 B1组
9、10、11、12 C1组
13
称量A与B,记录结果R1(这里用大于0表示A>B,其它类推)
然后二次分组
13、2、 7、 8 A2组
1、 6、11、12 B2组
5、10、 3、 4 C2组
9
称量A2与B2,记录结果R2
开始分析结果:
如果R1=R2=0,则证明非标准球没有上过天平,这样,嫌疑球有2个:9号球、10号球。符合我前面提出的解决条件。可以解决这个问题。结果将在9,10中产生。
如果R1=0,R2>0(或者R2<0),则证明第二次测量的时候,非标准球上了天平,这样,嫌疑球有三个:13,11,12。这符合我在前面提到的第二种情况,也可解决。结果将在13,11,12中产生。
如果R1>0,R2=0,非常简单,这证明非标准球在第二次测量的时候,离开了天平,嫌疑球有三个:5,3,4。我们可以用第一次的比较结果作条件,用第二个解决办法找到非标准球。结果将在5,3,4中产生。
如果
R1>0,R2>0,证明第二次测量的时候,非标准球一直天平上,但此时嫌疑球好像是有四个:1、2、6、7、8,其实不是这样的,从测试结果上看,非标准球没有离开过自己的位置,这样的话,只有2与6是嫌疑球。结果将在2,6中产生。
R1>0,R2<0,同理,非标准球移动了自己的位置,这么来说,嫌疑球就应该是:1,7,8。显然这符合第二个条件。结果将在1,7,8中产生。
显然已经没有必要讨论R1<0的情况了,这同R1>0实际上是一样的。
用C语言做了三个:
指针:
main()
{
long *num;
int i;
*num=*(num+1)=1 ;
for(i=2;i<30;i++)
{
*(num+i)=*(num+i-1)+*(num+i-2);
}
printf("the 30st number ia:%ld",*(num+29));
getch();
};
顺序表;
#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef long ElemType;
typedef struct{
ElemType *elem;
int length;
int listsize;
}SqList;
void InitList_Sq(SqList *L)
{
(*L).elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if (!L->elem) exit(OVERFLOW);
L->length=0;
L->listsize=LIST_INIT_SIZE;
return OK;
}
void ListInsert_Sq(SqList *L,int i,ElemType e)
{
ElemType *newbase,*p,*q;
if (i<1||i>L->length+1) return ERROR;
if(L->length>=L->listsize)
{
newbase=(ElemType *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));
if (!newbase) exit (OVERFLOW);
L->elem=newbase;
L->listsize+=LISTINCREMENT;
}
q=&(L->elem[i-1]);
for (p=&(L->elem[L->length-1]);p>=q;--p) *(p+1)=*p;
*q=e;
L->length++;
return OK;
}
main()
{
SqList *L;
int i;
long *num;
L=NULL;
clrscr();
InitList_Sq(L);
for(i=0;i<30;i++)
{
if(i <2)
*(num+i)=1;
if(i>=2)
*(num+i)=*(num+i-1)+*(num+i-2);
ListInsert_Sq(L,L->length+1,*(num+i));
}
printf("the 30st number is:%ld",L->elem[29]);
free(L);
getch();
}
用栈结构
#include <stdio.h>
#include <malloc.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OVERFLOW -2
typedef long ElemType;
typedef struct
{
ElemType *top,*base;
int stacksize;
}SqStack;
void InitStack(SqStack *s)
{
s->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
if (!s->base) exit (OVERFLOW);
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
}
void DestroyStack(SqStack *s)
{
free(s);
}
int StackEmpty(SqStack *s)
{
return (s->top==s->base);
}
int Push(SqStack *s,ElemType e)
{
if (s->top-s->base>=s->stacksize)
{
s->base=(ElemType *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(ElemType));
if (!s->base) exit (OVERFLOW);
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCREMENT;
}
*(s->top)=e;
s->top++;
return 1;
}
main()
{
SqStack *s;
int i ;
long a[29];
a[1]=a[0]=1;s=(SqStack *)malloc(sizeof(SqStack));
InitStack(s);
if (StackEmpty(s))
printf("stack s is empty.\n");
else
printf("stack s is not empty.\n");
printf("please input elem to push:\n");
for(i=0;i<30;i++)
{
if(i<2)
a[i]=1;
if(i>=2)
a[i]=a[i-1]+a[i-2];
Push(s,a[i]); }
printf("the 30st number:%ld",*(s->top-1));
DestroyStack(s);
getch();
}