uva 10862 Connect the Cable Wires大整数类c++

来源:互联网 发布:品茗网络计划2012教程 编辑:程序博客网 时间:2024/05/20 01:09

1: 1

2:1+(1+1)

3:1+2+(2+3)

4:1+2+5+(5+8)

而斐波那契数列1 1 2 3 5 8……

因此推出a[n]=a[n-1]+fib[2*i-1]+fib[2*1-2];

java代码

import java.util.*;import java.math.*;public class Main {public static void main(String args[]){BigInteger [] ans=new BigInteger[2010];ans[1]= new BigInteger("1");ans[2]= new BigInteger("3");BigInteger [] fib=new BigInteger[5020];fib[1]=new BigInteger("1");fib[2]=new BigInteger("1");for(int i=3;i<5020;i++){fib[i]=fib[i-1].add(fib[i-2]);}for(int i=3;i<2010;i++){ans[i]=ans[i-1].add(fib[2*i-3].add(fib[2*i-2]));}Scanner read=new Scanner(System.in);int n;n=read.nextInt();while(n!=0){System.out.println(ans[n]);n=read.nextInt();}}}

当然也有其他的方法,比如stainger的解法,c++代码

#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <algorithm>using namespace std;struct Bigint{    string a;    int sign;    Bigint() {}    Bigint( string b ) { (*this) = b; }    int size() {        return a.size();    }    Bigint inverseSign() {        sign *= -1;        return (*this);    }    Bigint normalize( int newSign ) {        for( int i = a.size() - 1; i > 0 && a[i] == '0'; i-- )            a.erase(a.begin() + i);        sign = ( a.size() == 1 && a[0] == '0' ) ? 1 : newSign;        return (*this);    }    void operator = ( string b ) {        a = b[0] == '-' ? b.substr(1) : b;        reverse( a.begin(), a.end() );        this->normalize( b[0] == '-' ? -1 : 1 );    }    bool operator < ( const Bigint &b ) const {        if( sign != b.sign ) return sign < b.sign;        if( a.size() != b.a.size() )            return sign == 1 ? a.size() < b.a.size() : a.size() > b.a.size();        for( int i = a.size() - 1; i >= 0; i-- ) if( a[i] != b.a[i] )            return sign == 1 ? a[i] < b.a[i] : a[i] > b.a[i];        return false;    }    bool operator == ( const Bigint &b ) const {        return a == b.a && sign == b.sign;    }    Bigint operator + ( Bigint b ) {        if( sign != b.sign ) return (*this) - b.inverseSign();        Bigint c;        for(int i = 0, carry = 0; i<a.size() || i<b.size() || carry; i++ ) {            carry+=(i<a.size() ? a[i]-48 : 0)+(i<b.a.size() ? b.a[i]-48 : 0);            c.a += (carry % 10 + 48);            carry /= 10;        }        return c.normalize(sign);    }    Bigint operator - ( Bigint b ) {        if( sign != b.sign ) return (*this) + b.inverseSign();        int s = sign; sign = b.sign = 1;        if( (*this) < b ) return ((b - (*this)).inverseSign()).normalize(-s);        Bigint c;        for( int i = 0, borrow = 0; i < a.size(); i++ ) {            borrow = a[i] - borrow - (i < b.size() ? b.a[i] : 48);            c.a += borrow >= 0 ? borrow + 48 : borrow + 58;            borrow = borrow >= 0 ? 0 : 1;        }        return c.normalize(s);    }    Bigint operator * ( Bigint b ) {        Bigint c("0");        for( int i = 0, k = a[i] - 48; i < a.size(); i++, k = a[i] - 48 ) {            while(k--) c = c + b;            b.a.insert(b.a.begin(), '0');        }        return c.normalize(sign * b.sign);    }    Bigint operator / ( Bigint b ) {        if( b.size() == 1 && b.a[0] == '0' ) b.a[0] /= ( b.a[0] - 48 );        Bigint c("0"), d;        for( int j = 0; j < a.size(); j++ ) d.a += "0";        int dSign = sign * b.sign; b.sign = 1;        for( int i = a.size() - 1; i >= 0; i-- ) {            c.a.insert( c.a.begin(), '0');            c = c + a.substr( i, 1 );            while( !( c < b ) ) c = c - b, d.a[i]++;        }        return d.normalize(dSign);    }    Bigint operator % ( Bigint b ) {        if( b.size() == 1 && b.a[0] == '0' ) b.a[0] /= ( b.a[0] - 48 );        Bigint c("0");        b.sign = 1;        for( int i = a.size() - 1; i >= 0; i-- ) {            c.a.insert( c.a.begin(), '0');            c = c + a.substr( i, 1 );            while( !( c < b ) ) c = c - b;        }        return c.normalize(sign);    }    void print() {        if( sign == -1 ) putchar('-');        for( int i = a.size() - 1; i >= 0; i-- ) putchar(a[i]);    }};int main(){    Bigint ans[2010];    ans[1]="1",ans[2]="3";    for(int i=3;i<2005;i++){        ans[i]=ans[i-1]+ans[i-1]+ans[i-1]-ans[i-2];    }    int n;    while(~scanf("%d",&n)&&n!=0){        ans[n].print();        cout<<endl;    }    return 0;}


0 0