uva 10862 Connect the Cable Wires大整數類c++

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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章