(寒假马拉松第一场 O题)
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]); } } }