标签:
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; }
uva 10862 Connect the Cable Wires大整数类c++
标签:
原文地址:http://www.cnblogs.com/Scale-the-heights/p/4322332.html