|
#include "stdafx.h"
#define N 1000
class Number{
public :
char digit[N];
int i;
Number(){
digit[0]='1';
digit[1]=0;
i=1;
}
};
void converse(char array[],int n){
int temp;
for(int i=n-1;i>=n/2;i--){
temp=array;
array=array[n-1-i];
array[n-1-i]=temp;
}
}
inline Number add(Number first,Number second){
Number c;
c.i=0;
int sum;
bool up;
char *p; //指向较短的数组
int max,min; //通过max和min来把短的数组后填'0'
up=0;
min=first.i>second.i?second.i:first.i;
max=first.i>second.i?first.i:second.i;
p=first.i>second.i?second.digit:first.digit;
for(int addzero=min;addzero<max;addzero++){
p[addzero]='0';
}
first.digit[max]=0;
second.digit[max]=0;
converse(first.digit,first.i);
converse(second.digit,second.i);
first.i=0;
second.i=0;
while(first.digit[first.i]!=0 && second.digit[second.i]!=0){
sum=first.digit[first.i]+second.digit[second.i]+up-'0'-'0';
c.digit[c.i]=sum%10+'0';
if(sum>9)up=1;
else up=0;
first.i++;
second.i++;
c.i++;
}
if(up)c.digit[c.i++]='1';
c.digit[c.i]=0;
//把多余的'0'去掉
while(c.digit[c.i-1]=='0' && c.i>=0)first.digit[--c.i]=0;
converse(c.digit,c.i);
//如果答案为0,上代码计算结果为空,将其变为 "0\0"
/* if(first.digit[0]==0){
first.digit[0]='0';
first.digit[first.i=1]=0;
}*/
return c;
}
int _tmain(int argc, _TCHAR* argv[])
{
int in;
while(scanf("%d",&in)!=EOF){
if(in==1 || in==2){
printf("1\n");
continue;
}
Number array[3];
int now=2,pre1,pre2;
for(int i=2;i<in;i++){
now=i%3;
pre1=now-1;
pre2=now-2;
if(pre1<0)pre1+=3;
if(pre2<0)pre2+=3;
array[now]=add(array[pre1],array[pre2]);
}
printf("%s\n",array[now].digit);
}
} |
|