Cod sursa(job #83183)

Utilizator pitbullpitbulll pitbull Data 10 septembrie 2007 12:41:31
Problema Cifra Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.73 kb
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
# define MAX 30000
int T,N;
int *saved;

void cifra(FILE*,int);
int ultcifra(int,int);

int main (){
	FILE *in=fopen("cifra.in","r");
	FILE *out=fopen("cifra.out","w");
	fscanf(in,"%d",&T);
	int i;
	saved=(int*)malloc(MAX*sizeof(int));
	for (i=0;i<MAX;i++)
		saved[i]=0;
		
	
	clock_t a,b;
	a=clock();
	for (i=1;i<=T;i++){
		fscanf(in,"%d",&N);
		cifra(out,N);
	}
	b=clock();
	int time=(b-a);
	fprintf(stdout,"%d",time);
	fclose(in);
	fclose(out);
	free(saved);
	return 0;
}
	
void cifra(FILE *out,int nr){
	int cifra=0;
	int i=0,j;
	for (i=nr;i>=1;i--)
		if(saved[i]!=0)
			break;	
	cifra=saved[i];
	printf("%d->",cifra);
	for (j=i+1;j<=nr;j++){
			cifra+=ultcifra(j%10,j);
			cifra%=10;	
	}
	fprintf(out,"%d\n",cifra);
	saved[nr]=cifra;//am salvat ultima cifra	
}

int ultcifra(int nr,int pow){
	if(nr==0||nr==1||nr==5||nr==6)
		return nr;
	else if(nr==4)
		switch(pow%2){
			case 0:return 6;break;
			case 1:return 4;break;
		}	
	else if(nr==9)
		switch(pow%2){
			case 0:return 1;break;
			case 1:return 9;break;
		}
	else if(nr==3)
		switch(pow%4){
			case 0:return 1;break;
			case 1:return 3;break;
			case 2:return 9;break;
			case 3:return 7;break;
		}	
	else if(nr==2)
		switch(pow%4){
			case 0:return 6;break;
			case 1:return 2;break;
			case 2:return 4;break;
			case 3:return 8;break;
		}		
	else if(nr==8)
		switch(pow%4){
			case 0:return 6;break;
			case 1:return 8;break;
			case 2:return 4;break;
			case 3:return 2;break;
		}	
	else if(nr==7)
		switch(pow%4){
			case 0:return 1;break;
			case 1:return 7;break;
			case 2:return 9;break;
			case 3:return 3;break;
		}	
		
		
	return 0;			
}