add fibnacci serial
This commit is contained in:
parent
a4def7080e
commit
f3ad87f0f9
90
fibnacci_serial/v.cpp
Normal file
90
fibnacci_serial/v.cpp
Normal file
@ -0,0 +1,90 @@
|
||||
#include <vector>
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
|
||||
#define UNIT 100000000
|
||||
#define UNIT_LEN 8
|
||||
const char *zero = "00000000";
|
||||
|
||||
typedef vector<int> BN;
|
||||
|
||||
string BN_str(BN *b)
|
||||
{
|
||||
string sn = to_string(b->at(b->size() - 1));
|
||||
for (int i = b->size() - 2; i >= 0; i--) {
|
||||
string su = to_string(b->at(i));
|
||||
if (su.length() < UNIT_LEN) {
|
||||
sn += (zero + su.length());
|
||||
}
|
||||
sn += su;
|
||||
}
|
||||
return sn;
|
||||
}
|
||||
|
||||
int BN_len(BN *b)
|
||||
{
|
||||
if (!b->size()) return 0;
|
||||
int l = 0;
|
||||
for (int h = b->back(); h; h /= 10) l += 1;
|
||||
return (b->size() - 1) * UNIT_LEN + l;
|
||||
}
|
||||
|
||||
BN BN_init(int x)
|
||||
{
|
||||
BN v;
|
||||
v.push_back(x);
|
||||
return v;
|
||||
}
|
||||
|
||||
void BN_merge(BN *a, BN *b)
|
||||
{
|
||||
int carry_up = 0;
|
||||
int ib = 0;
|
||||
for (int ia = 0; ia < a->size(); ia++, ib++) {
|
||||
carry_up += a->at(ia) + b->at(ib);
|
||||
(*a)[ia] = carry_up % UNIT;
|
||||
carry_up /= UNIT;
|
||||
}
|
||||
for (; ib < b->size(); ib++) {
|
||||
carry_up += b->at(ib);
|
||||
a->push_back(carry_up % UNIT);
|
||||
carry_up /= UNIT;
|
||||
}
|
||||
for (; carry_up; carry_up /= UNIT) {
|
||||
a->push_back(carry_up % UNIT);
|
||||
}
|
||||
}
|
||||
|
||||
int BN_digit(BN *a, int n)
|
||||
{
|
||||
string sn = BN_str(a);
|
||||
if (n > sn.length()) return -1;
|
||||
return sn[n - 1] - '0';
|
||||
}
|
||||
|
||||
int digit_of_fib_digit(int n)
|
||||
{
|
||||
BN a = BN_init(1);
|
||||
BN b = BN_init(1);
|
||||
BN *p = &a;
|
||||
BN *q = &b;
|
||||
for (;;) {
|
||||
cout << BN_str(p) << endl;
|
||||
int l = BN_len(p);
|
||||
if (l >= n) {
|
||||
return BN_digit(p, n);
|
||||
}
|
||||
n -= l;
|
||||
BN_merge(p, q);
|
||||
BN *t = p;
|
||||
p = q;
|
||||
q = t;
|
||||
}
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
cout << digit_of_fib_digit(800) << endl;
|
||||
return 0;
|
||||
}
|
17
fibnacci_serial/v.py
Normal file
17
fibnacci_serial/v.py
Normal file
@ -0,0 +1,17 @@
|
||||
|
||||
def gen_fib():
|
||||
a, b = 0, 1
|
||||
while True:
|
||||
yield b
|
||||
a, b = b, a + b
|
||||
|
||||
def digit_in_fib(n):
|
||||
for x in gen_fib():
|
||||
print(x)
|
||||
s = str(x)
|
||||
l = len(s)
|
||||
if l >= n:
|
||||
return s[n - 1]
|
||||
n -= l
|
||||
|
||||
print(digit_in_fib(800))
|
Loading…
x
Reference in New Issue
Block a user