码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-03-08 22:52:36      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:

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

 

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

标签:

原文地址:http://www.cnblogs.com/Scale-the-heights/p/4322332.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!