Đề bài: Xét dãy số {u}:
U0 = 6
U1 = 17
Uk+1 = 5Uk - 6 Uki-1 (k >= 2)
Kiểm tra số tự nhiên N có thuộc vào dãy số trên hay không. Dữ liệu vào: file number.in - Dòng đầu tiên: số m chỉ các số Ni cần kiểm tra. - m dòng tiếp theo, mỗi dòng chứa một số tự nhiên Ni Dữ liệu ra: file number.out - m dòng, mỗi dòng ghi 1 hoặc 0. Ghi là 1 nếu số Ni thuộc dãy số {u} ngược lại ghi là 0.
input.txt
106
6
17
49
143
421
1247
3709
11063
33061
98927
296269
887783
2661301
7979807
23931229
71777303
215299141
645831887
1937364589
5811831623
17434970581
52303863167
156909492349
470724282743
1412164459621
4236476601647
12709396250509
38128121642663
114384230710261
343152423695327
1029456734215069
3088369128903383
9265105239226501
27795311422712207
83385925678202029
250157759854736903
750473245204472341
2251419666893940287
6754258863242867389
20262776314850695223
60788328394796271781
182364984084877187567
547094950055608307149
1641284845768778410343
4923854528510242208821
14771563567938540582047
44314690668631249657309
132944071935525004794263
398832215665837526027461
1196496646716037601371727
3589489939585162850693869
10768469817629588645238983
32305409450636966122031701
96916228347407298738724607
290748685033214696961432829
872246055081629692374816503
2616738165208860280105485541
7850214495554523246278528687
23550643486519454550759730189
70651930459270133276127478823
211955791377233939076079012981
635867374130548895723630191967
1907602122389340844161676881949
5722806367163410846466603257943
17168419101481009167362954998021
51505257304424580758015155442447
154515771913236848785898047224109
463547315739636759381399303465863
1390641947218762704191608233984661
4171925841655992964669645349128127
12515777524967388598198577341732669
37547332574900985202975014613894583
112641997724700594425683609019076901
337925993174097060910567957412017007
1013777979522281737998738132945623629
3041333938566826324530282920256016103
9124001815700441194658985803606338741
27372005447101248026113231496495597087
82116016341303592962612242660839952989
246348049023910476656381824325226182423
739044147071730825506235665661091194181
2217132441215191267592887382354098876367
6651397323645571384927022917803947216749
19954191970936709319077790294895142825543
59862575912810118285826813967652030827221
179587727738430335514667328068889297182847
538763183215290967858375756538534300950909
1616289549645872826203874814279335721657463
4848868648937618323869119532165472802581861
14546605946812854662122348775151349682964527
43639817840438563367397026682763911599331469
130919453521315688864251040762911459898870183
392758360563947064116873043717973829898362101
1178275081691841187398858974012400390098589407
3534825245075523552293056607754158971102774429
10604475735226570637072129194696392514922335703
31813427205679711871602306326957008747995031941
95440281617039135535578756466606688650441145487
286320844851117406448279944371291390764235535789
858962534553352219027927183056816821918530806023
2576887603660056656449956249056335765007240815381
7730662810980169968082218146940777893525019240767
23191988432940509901711353240365874877581651311549
69575965298821529700063457320184707026758141113143
208727895896464589090049167158728285868300797696421
626183687689393767249865091872533187180955141803247
main.c
#include<stdio.h>
#include<stdlib.h>
typedef struct stack
{
int a;
struct stack *next;
} node;
node* khoitao()
{
return(NULL);
}
int rong(node*top)
{
return(top==NULL);
}
int push(node**top,node**tmp)
{
(*tmp)->next=NULL;
if(*top==NULL)
{
*top=*tmp;
}
else
{
(*tmp)->next=*top;
*top=*tmp;
}
return(0);
}
int pop(node **top)
{
int tmp=0;
node*x;
if(rong(*top))
{
printf("Stack rong.\n");
return(0);
}
else
{
tmp=(*top)->a;
x=*top;
*top=(*top)->next;
free(x);
}
return(tmp);
}
FILE*in,*out;
node*top1,*tmp;
int nhap(node**top1) // so so sanh
{
int dk=1,bonus;
char tem;
*top1=khoitao();
do // Nhap stack 1
{
if((tmp=(node*)malloc(sizeof( struct stack)))==NULL) //tao node
{
printf("khong cap phat duoc bo nho\n");
exit(1);
}
tem=getc(in);
if(tem>='0'&&tem<='9') // lay gia tri
{
tmp->a=tem-48;
push(top1,&tmp); // them vao stack1
printf("%d\n",tmp->a);
dk=1;
}
else dk=0;
}while(dk);
free(tmp);
return 0;
}
int nhan(int x,node**top)
{
node*top10;
int bonus;
/* nhan stack */
top10=khoitao();
bonus=0;
while(rong(*top)!=1)
{
if((tmp=(node*)malloc(sizeof( struct stack)))==NULL) //tao node
{
printf("khong cap phat duoc bo nho\n");
exit(1);
}
printf("--");
tmp->a= pop(top)*x + bonus;
if(tmp->a>=10)
{
bonus=tmp->a/10;
tmp->a=tmp->a%10;
}
else bonus=0;
push(&top10,&tmp);
}
//*top=top10;
/* while(top10!=NULL)
{
fprintf(out,"%d-",top10->a);
top10=top10->next;
}
while(top!=NULL)
{
pop(top);
}
*/
while(top10!=NULL)
{
if((tmp=(node*)malloc(sizeof( struct stack)))==NULL) //tao node
{
printf("khong cap phat duoc bo nho\n");
exit(1);
}
tmp->a=pop(&top10);
push(top,&tmp);
}
return 0;
}
node* tru(node**top2,node**top3)
{
node*top10,*top22,*top33;
node*top,*tmp2;
int bonus,a,b;
/* tru stack */
top=khoitao();
top10=khoitao();
top22=khoitao();
top33=khoitao();
bonus=0;
while((rong(*top2)&&rong(*top3)&&bonus==0)!=1)
{
if((tmp=(node*)malloc(sizeof( struct stack)))==NULL) //tao node
{
printf("khong cap phat duoc bo nho\n");
exit(1);
}
a=pop(top2);
if((tmp2=(node*)malloc(sizeof( struct stack)))==NULL) //tao node
{
printf("khong cap phat duoc bo nho\n");
exit(1);
}
tmp2->a=a;
push(&top22,&tmp2);
b=pop(top3);
if((tmp2=(node*)malloc(sizeof( struct stack)))==NULL) //tao node
{
printf("khong cap phat duoc bo nho\n");
exit(1);
}
tmp2->a=b;
push(&top33,&tmp2);
printf("++");
if(a>=b)
{
tmp->a= a-b +bonus;
bonus=0;
}
else
{
tmp->a= 10+a-b+bonus;
bonus=-1;
}
push(&top10,&tmp);
}
while(top10!=NULL)
{
if((tmp=(node*)malloc(sizeof( struct stack)))==NULL) //tao node
{
printf("khong cap phat duoc bo nho\n");
exit(1);
}
tmp->a=pop(&top10);
push(&top,&tmp);
}
while(top22!=NULL)
{
if((tmp=(node*)malloc(sizeof( struct stack)))==NULL) //tao node
{
printf("khong cap phat duoc bo nho\n");
exit(1);
}
tmp->a=pop(&top22);
push(top2,&tmp);
}
while(top33!=NULL)
{
if((tmp=(node*)malloc(sizeof( struct stack)))==NULL) //tao node
{
printf("khong cap phat duoc bo nho\n");
exit(1);
}
tmp->a=pop(&top33);
push(top3,&tmp);
}
return top;
}
int bang(node*top)
{
node*chay;
chay=top;
while(chay!=NULL)
{
if(chay->a>0) return 0;
chay=chay->next;
}
return 1;
}
int kiem_hang(node*top)
{
node*tmp,*top2,*top3,*chay;
top2=khoitao();
top3=khoitao();
// nhap k-2 gia tri 6
if((tmp=(node*)malloc(sizeof( struct stack)))==NULL) //tao node
{
printf("khong cap phat duoc bo nho\n");
exit(1);
}
tmp->a=6;
push(&top2,&tmp);
// nhap k-1 gia tri 17
if((tmp=(node*)malloc(sizeof( struct stack)))==NULL) //tao node
{
printf("khong cap phat duoc bo nho\n");
exit(1);
}
tmp->a=17;
push(&top3,&tmp);
tmp=tru(&top,&top2);
if(bang(tmp))
{
while(rong(top2)!=1) pop(&top2);
while(rong(tmp)!=1) pop(&tmp);
return 1;
}
tmp=tru(&top,&top3);
if(bang(tmp))
{
while(rong(top3)!=1) pop(&top3);
while(rong(tmp)!=1) pop(&tmp);
return 1;
}
do
{
printf("\n\n\n\n\n");
nhan(5,&top3);
nhan(6,&top2);
tmp=tru(&top3,&top2);
chay=tmp;
while(chay!=NULL)
{
printf("%d-",chay->a);
chay=chay->next;
}
return 1;
if(bang(tmp))
{
while(rong(top2)!=1) pop(&top2);
while(rong(top3)!=1) pop(&top3);
while(rong(tmp)!=1) pop(&tmp);
return 1;
}
while(top2!=NULL) pop(&top2);
top2=top3;
top3=tmp;
}while(bang(tmp)!=0);
return 0;
}
int main()
{
int n,i;
double a;
out=fopen("output.txt","w+");
if((in=fopen("input.txt","r+"))==NULL)
{
printf("khong nhap duoc file");
return 1;
}
fscanf(in,"%d",&n);
getc(in);
for(n;n>0;n--)
{
nhap(&top1);
fprintf(out,"%d\n",kiem_hang(top1));
}
fclose(in);
fclose(out);
return 0;
}