明天去献血小板,今天不让我吃这个吃那个,连牛奶都不让我喝,竟然还不让我熬夜。。。我能说我到了晚上2点才有困意么,唉。。。。
后天要去中科大会会华为,华为以高薪and累死人著称。。。说实话我也不想去华为的,搞电子产品不是专业的软件公司。。而且是中国的企业,不喜欢。。。崇洋媚外了么?我就崇洋媚外!
再过些天要去浙大。。。sohu一帮混蛋不来我们学校。。跑吧。。。杭州、南京、不行就武汉。。。
说点正经的,前些日子看到google面试说怎么计算一个数N的阶乘末尾的0的个数,我给出了算法,虽然很自信算法没有问题,但是终究不能每个都计算出来验证:因为计算机对数字的长度有限制的哇。。。学习过计算机的都知道,用过计算器的都知道数字不能计算太大呢!今天给出算法,一个数字N的阶乘,不受大小限制,里面有很多子函数,懂C语言的可以自行调用,也可以调出很多功能的哇~~~哈哈!C语言版,通过gcc编译器编译!链表什么的都是根据自己需要写的,不拘泥于形式,用自己写的代码舒服,so,没调用什么头文件!上代码吧。。。不要挑我格式上的问题,对格式不感兴趣。。。如果能提高性能的话虚心接受,毕竟代码是我一边想一边写出来的,没有全部成型后再写,性能上肯定会有很多不好的地方的!
特意强调一下,这是原创 ! [原创]
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#define MAXSIZE 100
/*
List With Header Node
*/
typedef struct NODE
{
char num;
struct NODE *next;
} List;
List* init()
{
List* node=(List*)malloc(sizeof(List));
node->next=NULL;
return node;
}
void lastAdd(List* L,char val)
{
List* node=(List*)malloc(sizeof(List));
node->num=val;
while(L->next)
{
L=L->next;
}
L->next=node;
node->next=NULL;
}
void preAdd(List* L,char val)
{
List* node=(List*)malloc(sizeof(List));
node->num=val;
node->next=L->next;
L->next=node;
}
List* getLast(List* L)
{
List* node=L;
while(node->next)
{
node=node->next;
}
return node;
}
void dele_last_node(List* L)
{
List *p=L,*q;
while(p->next)
{
if(p->next->next)
{
p=p->next;
}
else
{
q=p;
p=p->next;
// q=p;
}
}
free(p);
q->next=NULL;
}
void println(List* L)
{
if(!L->next)
{
printf("Empty List,Break\n");
return;
}
else
L=L->next;
while(L)
{
printf("%C",L->num);
L=L->next;
}
printf("\n");
}
int getSize(List* L)
{
int size=0;
List* p=L->next;
while(p)
{
size++;
p=p->next;
}
return size;
}
char toc(int i)
{
return (char)(i+48);
}
int toi(char c)
{
return ((int)c)-48;
}
List* changeToList(int N)
{
List* list=init();
// int level=10;
int interVal=N/10,floVal=N%10;
while(interVal)
{
preAdd(list,toc(floVal));
// interVal=interVal/10;
floVal=interVal%10;
interVal=interVal/10;
}
preAdd(list,toc(floVal));
// println(list);
return list;
}
/*
val less than 10
*/
List* singleStep(List* L,int val)
{
List* p=L;
/*
goto the end
*/
while(p->next)
{
p=p->next;
}
//now p is a pointer to point the last node
int calcu[2]={0,0};//Calculation useful
List* newlist=init();//newlist is a list to save new value for calculation
while(L->next)
{
int temp=toi(getLast(L)->num);
int temp_val=temp*val+calcu[0];
// printf("%d,%d,%d,%d\n",calcu[0],calcu[1],temp,temp_val);
calcu[0]=temp_val/10;
calcu[1]=temp_val%10;
// printf("%d,%d,%d,%d\n",calcu[0],calcu[1],temp,temp_val);
preAdd(newlist,toc(calcu[1]));
dele_last_node(L);
}
if(calcu[0])
{
preAdd(newlist,toc(calcu[0]));
}
// println(newlist);
return newlist;
}
List* copy(List* L)
{
List* newList=init();
List* p=newList;
L=L->next;
while(L)
{
List* node=(List*)malloc(sizeof(List));
node->num=L->num;
node->next=NULL;
p->next=node;
L=L->next;
p=p->next;
}
return newList;
}
List* add_list(List* fir,List* sec)
{
int size_fir=getSize(fir);
int size_sec=getSize(sec);
int add_arr[2]={0,0};
// printf("first_size=%d,second_size=%d\n",size_fir,size_sec);
List* value_list=init();//value
/*
compare two num to add calculation
*/
if(size_fir==size_sec)
{
// printf("Run size_fir=size_sec!\n");
while(fir->next)
{
int ifir=toi(getLast(fir)->num);
int isec=toi(getLast(sec)->num);
int temp=ifir+isec+add_arr[0];
// printf("%d,%d\n",add_arr[0],add_arr[1]);
add_arr[0]=temp/10;
add_arr[1]=temp%10;
preAdd(value_list,toc(add_arr[1]));
dele_last_node(fir);
dele_last_node(sec);
}
return value_list;
}
if(size_fir<size_sec)
{
// printf("Run size_fir<size_sec!\n");
while(fir->next)
{
int ifir=toi(getLast(fir)->num);
int isec=toi(getLast(sec)->num);
int temp=ifir+isec+add_arr[0];
add_arr[0]=temp/10;
add_arr[1]=temp%10;
// printf("%d,%d,%d,%d\n",ifir,isec,add_arr[0],add_arr[1]);
preAdd(value_list,toc(add_arr[1]));
dele_last_node(fir);
dele_last_node(sec);
}
while(sec->next)
{
int single=toi(getLast(sec)->num);
int val_temp=single+add_arr[0];
add_arr[0]=val_temp/10;
add_arr[1]=val_temp%10;
// printf("%d,%d,%d,%d\n",single,val_temp,add_arr[0],add_arr[1]);
preAdd(value_list,toc(add_arr[1]));
dele_last_node(sec);
}
return value_list;
}
if(size_fir>size_sec)
{
// printf("Run size_fir>size_sec!\n");
while(sec->next)
{
int ifir=toi(getLast(fir)->num);
int isec=toi(getLast(sec)->num);
int temp=ifir+isec+add_arr[0];
add_arr[0]=temp/10;
add_arr[1]=temp%10;
preAdd(value_list,toc(add_arr[1]));
dele_last_node(fir);
dele_last_node(sec);
}
while(fir->next)
{
int single=toi(getLast(fir)->num);
int val_temp=single+add_arr[0];
add_arr[0]=val_temp/10;
add_arr[1]=val_temp%10;
preAdd(value_list,toc(add_arr[1]));
dele_last_node(fir);
}
return value_list;
}
}
// List* add_arr[MAXSIZE];//use list array to add
List* calcu_big_num(List* fir,List* sec)
{
List* add_arr[MAXSIZE];//use list array to add
// List* add_arr=(List*)malloc(sizeof(List)*MAXSIZE);
size_t level=0;
while(sec->next)
{
//add_arr[level]=init();
// List* cal_tmp=init();
List* copy_fir=copy(fir);
// println(copy_fir);
List* cal_tmp=singleStep(copy_fir,toi(getLast(sec)->num));
// println(cal_tmp);
// add_arr[level]=cal_tmp;
// add_arr[level]=singleStep(fir,toi(getLast(sec)->num));
// level++;
// println(cal_tmp);
size_t size=level;
while(size)
{
lastAdd(cal_tmp,toc(0));
size--;
}
add_arr[level]=cal_tmp;
dele_last_node(sec);
level++;
// add_arr[]
}
List* value_list=add_arr[0];//value list
//add some temp list
size_t i=0;
for(;i<level-1;++i)
{
value_list=add_list(value_list,add_arr[i+1]);
}
return value_list;
}
main()
{
// List* l=N_main(1234);
printf("This Programming is calculation a number N's redirect without size limitation!\nNow Put a number N:\n");
int n;
scanf("%d",&n);
assert(n);
assert(changeToList(n)->next);
printf("Calculating...\n");
List* value=changeToList(n);
// printf("change to list complete...\n");
// println(value);
while(--n&&n!=1)
{
List* tmp=changeToList(n);
// println(tmp);
value=calcu_big_num(value,tmp);
println(value);
}
// List* l=changeToList(n);
printf("Completed!Value is:\n");
println(value);
}