POJ 2680 / ZOJ 2584 : Computer Transformation - 打表+找规律+高精度 / java大数

(寒假马拉松第一场 O题)

 java大数这么有用啊@_@
java得熟练熟练,今天交题才发现就要忘光了啊==!

想法参考这位同志,感谢。
题意:
开始的数字是1,每次1变为01,0变为10,问经过n步后,有多少对连续的0,即多少对00.
分析:
打表很容易发现规律。
再用java的高精度(大数)得到结果就行了。

设ans[i]是变换i次后的结果,由以下打表程序运行前面的较小的数(这里是前10个数)不难发现,
当i为奇数时,s[i+1]=2 * s[i]+1;当i为偶数时,s[i+1]=2 * s[i]-1;
当然也可以不打表直接找出规律的。
#include<iostream>
#include<cstdlib>
#include<stdio.h>
#include<memory.h>
using namespace std;
int s1[1000];
int s2[1000];
int main()
{
    int i=0;
    memset(s1,-1,sizeof(s1));
    memset(s2,-1,sizeof(s2));
    s1[0]=1;
    while(i<10)
    {
        i++;
        int cc=0;
        for(int j=0;;j++)
        {
            if(s1[j]!=-1)
            {
                if(s1[j]==0) {s2[cc++]=1;s2[cc++]=0;}
                else {s2[cc++]=0;s2[cc++]=1;}
            }
            else break;
        }
        /*for(int j=0;j<cc;j++)
        cout<<s2[j];
        cout<<"*"<<endl;*/
        int count=0;
        for(int j=0;j<cc-1;j++)
        {
            if(s2[j]==0&&s2[j+1]==0)
            count++;
        }
        cout<<i<<" "<<count<<endl;
        for(int j=0;j<cc;j++)
        s1[j]=s2[j];
    }
}


java大数实现程序代码:
import java.util.*;
import java.math.*;

public class Main{
	public static BigInteger[] a=new BigInteger[1005];
	public static BigInteger[] b=new BigInteger[1005];
	public static void pre(){
		BigInteger n0=BigInteger.valueOf(0);
		BigInteger n1=BigInteger.valueOf(1);
		a[1]=n0;
		a[2]=n1;
		b[2]=n1;
		int i;
		for(i=3;i<=1000;i++){
			if(i%2==0)
				a[i]=b[i-1].add(n1);
			else			
				a[i]=b[i-1];
			b[i]=b[i-1].add(a[i]);				
		}
	}

	public static void main(String[] args){
	pre();
	Scanner sc=new Scanner(System.in);
	while(sc.hasNext()){
		int n=sc.nextInt();
		System.out.println(a[n]);
	}
}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值