1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 #include <ctime> 5 #include <cstring> 6 using namespace std; 7 #define maxsize 1005 8 //建立一个结构体 9 struct hp 10 { 11 int len;//用来存储转化为整型后的长度 12 int s[maxsize+1];//用来存储每一位 13 }; 14 //copy 函数把b copy给a 15 void copy(hp &a,hp &b) 16 { 17 a.len=b.len; 18 for(int i=1;i<=b.len;i++) 19 a.s[i]=b.s[i]; 20 } 21 //输入函数 22 void input(hp &a,string str) 23 { 24 int i; 25 while(str[0]=='0' && str.size()!=1) 26 str.erase(0,1);//删除第一个元素 27 a.len=(int)str.size();//把str的长度复制给a的len 28 for(i=1;i<=a.len;++i) 29 a.s[i]=str[a.len-i]-48;//a数组存储每一位,并且字符要逆向存入数组 30 for (i=a.len+1;i<=maxsize;++i) 31 a.s[i]=0;//剩下的为0 32 } 33 //输出函数 34 void print(const hp &y) 35 { 36 int i; 37 for(i=y.len;i>=1;i--)//注意输出是要后面向前输出i=y.len 38 printf("%d",y.s[i]); 39 cout<<endl; 40 } 41 42 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 43 1 高精度加法 44 void plusk(const hp &a,const hp &b,hp &c) 45 { 46 int i,len; 47 for(i=1;i<=maxsize;i++) 48 c.s[i]=0;//初始化数组可以用memset 49 //len为两者中的最大值 50 if(a.len>b.len) 51 len=a.len; 52 else 53 len=b.len; 54 //计算 55 for(i=1;i<=len;i++) 56 { 57 c.s[i]+=a.s[i]+b.s[i];//注意这里是c.s[i]+=a.s[i]+b.s[i] 58 if(c.s[i]>=10)//考虑进位思想 59 { 60 c.s[i]-=10; 61 c.s[i+1]++; 62 } 63 } 64 if(c.s[len+1]>0) //最后一位有进位情况 65 len++; 66 c.len=len; 67 } 68 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 69 2 高精度减法 70 void subtract(const hp &a,const hp &b,hp &c) 71 { 72 int i,len; 73 for(i=1;i<=maxsize;i++) 74 c.s[i]=0;//初始化为0 75 //求最大的长度 76 if(a.len>b.len) 77 len=a.len; 78 else 79 len=b.len; 80 //减法计算 81 for(i=1;i<=len;i++) 82 { 83 c.s[i]+=a.s[i]-b.s[i];//这个地方注意c.s[i]+=a.s[i]-b.s[i] 84 if(c.s[i]<0)//如果小于0则要向前借位 85 { 86 c.s[i]+=10;//这里对应加10 87 c.s[i+1]--;//前一位减1 88 } 89 } 90 while(len>1&&c.s[len]==0) 91 len--;//舍去前面的0 92 c.len=len; 93 } 94 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 95 3 高精度比较 96 int compare(const hp &a,const hp &b) 97 { 98 int len; 99 //求最大的长度 100 if(a.len>b.len) 101 len=a.len; 102 else 103 len=b.len; 104 while(len>0 && a.s[len]==b.s[len]) 105 len--; 106 if(len==0) //如果两个相等 107 return 0; 108 else 109 return a.s[len]-b.s[len];//a.s[len]-b.s[len]如果是负数则说明a小于b,反之 110 } 111 112 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 113 4高精度*单精度 114 void multiply(const hp &a,int b,hp &c) 115 { 116 int i,len; 117 for(i=1;i<=maxsize;i++) 118 c.s[i]=0;//初始化为0 119 len=a.len; 120 //计算乘法 121 for(i=1;i<=len;i++) 122 { 123 c.s[i]+=a.s[i]*b;//把每一位乘上b存到结构体C里,这里是 c.s[i]+=a.s[i]*b 124 //进位思想 125 c.s[i+1]+=c.s[i]/10; 126 c.s[i]%=10; 127 } 128 //处理进位 129 len++; 130 while(c.s[len]>=10) 131 { 132 //进位运算 133 c.s[len+1]+=c.s[len]/10; 134 c.s[len]%=10; 135 len++; 136 } 137 while(len>1&&c.s[len]==0) 138 len--;//舍去前面没用的0 139 c.len=len; 140 } 141 142 143 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 144 5高精度*高精度 145 void multiplyh(const hp &a,const hp &b,hp &c) 146 { 147 int i,j,len; 148 for(i=1;i<=maxsize;i++) 149 c.s[i]=0;//初始化为0 150 //计算 151 for(i=1;i<=a.len;i++) 152 for(j=1;j<=b.len;j++) 153 { 154 c.s[i+j-1]+=a.s[i]*b.s[j];//注意这里的计算 155 c.s[i+j]+=c.s[i+j-1]/10; 156 c.s[i+j-1]%=10; 157 } 158 //////////////////////////// 159 len=a.len+b.len+1; 160 while(len>1&&c.s[len]==0) 161 len--;//舍去前面没用的0 162 c.len=len; 163 } 164 165 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 166 6高精度/单精度 {d为余数} 167 void divide(const hp &a,int b,hp &c,int &d) 168 { 169 int i,len; 170 for(i=1;i<=maxsize;i++) 171 c.s[i]=0;//初始化为0 172 len=a.len; 173 d=0; 174 //注意除法的计算要从高位向下除 175 for(i=len;i>=1;i--) 176 { 177 d=d*10+a.s[i];//计算 178 c.s[i]=d/b;//存入c中 179 d%=b;//d为于数 180 } 181 //////////////////////////////// 182 while(len>1&&c.s[len]==0) 183 len--;//舍去前面没用的0 184 c.len=len; 185 } 186 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 187 7 高精度*10 188 void multiply10(hp &a) 189 { 190 int i; 191 //乘上10就是每一位都向前移动,而s[1]=0; 192 for(i=a.len;i>=1;i--) 193 a.s[i+1]=a.s[i]; 194 a.s[1]=0; 195 ////////////////////// 196 a.len++; 197 while(a.len>1&&a.s[a.len]==0) 198 a.len--;//舍去前面没用的0 199 } 200 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 201 8 高精度/高精度 {d为余数} 202 void divideh(const hp &a,const hp &b,hp &c,hp &d) 203 { 204 hp e; 205 int i,len; 206 //初始化 207 for(i=1;i<=maxsize;i++) 208 { 209 c.s[i]=0; 210 d.s[i]=0; 211 } 212 //////////////////////////// 213 len=a.len; 214 d.len=1; 215 for(i=len;i>=1;i--) 216 { 217 multiply10(d);//高进度乘上10 218 d.s[1]=a.s[i]; 219 while(compare(d,b)>=0) 220 { 221 subtract(d,b,e); 222 d=e; 223 c.s[i]++; 224 } 225 } 226 while(len>1&&c.s[len]==0) 227 len--;//舍去前面没用的0 228 c.len=len; 229 } 230 /////////////////////////////////////////////////////////////////// 231 hp sum[1003];//创建一个结构体数组 232 int main() 233 { 234 int n=1002; 235 hp a, b,c,tmp; 236 c.len=0; 237 a.s[1]=1; 238 for(int i=2;i<1002;i++) 239 { 240 b.s[i]=0; 241 a.s[i]=0; 242 } 243 for(int i=0;i<1002;i++) 244 { 245 sum[i].len=1; 246 memset(sum[i].s,0,sizeof(sum[i].s)); 247 } 248 a.len=1; 249 b.s[1]=2 ; 250 sum[1].s[1]=2; 251 sum[2].s[1]=1; 252 b.len=1; 253 int pos=2; 254 if(n>2) 255 { 256 for(int i=1;i<n;i++) 257 { 258 plusk(a,b,c); 259 copy(sum[pos],c); 260 int pos2; 261 pos2=pos+1; 262 copy(a,b); 263 copy(b,c); 264 pos++; 265 } 266 } 267 while(cin>>n) 268 { 269 print(sum[n]); 270 } 271 return 0; 272 }
原文链接:http://blog.csdn.net/cgl1079743846/article/details/7649244