您的位置:首页 > 其它

hdu 1250 Hat's Fibonacci(高精度加法+缩进+斐波那契数)

2013-08-20 15:45 330 查看
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1250

题目大意:求一个斐波那契数列的第n 项, n的上限是10000.

解题思路:因为本题的上限是10000,所以对于高精度要进行缩进。

#include <iostream>
#include <string.h>
using namespace std;

const int MAXN = 100000000;
const int N = 500;
const int M = 10000;

struct bign {
int len;
int s
;

bign() {
this -> len = 1;
memset(s, 0, sizeof(s));
}
bign (int number) {*this = number;}
bign (const char* number) {*this = number;}

bign change(bign cur) {
bign now;
now = cur;
for (int i = 0; i < cur.len; i++)
now.s[i] = cur.s[cur.len - i - 1];
return now;
}

void delZore() {	// 删除前导0.
bign now = change(*this);
while (now.s[now.len - 1] == 0 && now.len > 1) {
now.len--;
}
*this = change(now);
}

void put() {    // 输出数值。
delZore();
printf("%d", s[0]);
for (int i = 1; i < len; i++)
printf("%08d", s[i]);
}

bign operator = (const char *number) {
memset(s, 0, sizeof(s));
int dist = strlen(number);
int k = dist % 8;
for (int i = 0; i < k; i++)
s[0] = s[0] * 10 + number[i] - '0';
int cnt = 0;
for (int i = k; i < dist; i++, cnt++)
s[cnt / 8 + 1] = s[cnt / 8 + 1] * 10 + number[i] - '0';
len = cnt / 8 + 1;
return *this;
}

bign operator = (int number) {
char string
;
sprintf(string, "%d", number);
*this = string;
return *this;
}

bign operator + (const bign &cur){
bign sum, a, b;
sum.len = 0;
a = a.change(*this);
b = b.change(cur);

for (int i = 0, g = 0; g || i < a.len || i < b.len; i++){
int x = g;
if (i < a.len) x += a.s[i];
if (i < b.len) x += b.s[i];
sum.s[sum.len++] = x % MAXN;
g = x / MAXN;
}
return sum.change(sum);
}
};

bign num[M + 10];
int main() {
int n;
num[1] = num[2] = num[3] = num[4] = 1;
for (int i = 5; i < M + 5; i++)
num[i] = num[i - 1] + num[i - 2] + num[i - 3] + num[i - 4];
while (scanf("%d", &n) == 1) {
num
.put();
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: