现在的位置: 首页 > 综合 > 正文

无相邻1问题

2012年09月20日 ⁄ 综合 ⁄ 共 943字 ⁄ 字号 评论关闭

无相邻1问题

问题描述:

123可构作n位数,计算其中没有相邻的1出现的个数。

输入:

输入文件中有若干行。每一行上有一个正整数n作为一个测试数据,(1<=n<=100)。

输入直到文件结束。

输出:

对输入文件中的每个测试数据,在输出文件输出没有相邻的1出现的n位数的个数。

输入样例:

3

4

1

 

输出样例

22

60

3

 

分析:设
f[n]为符合条件的n位数的个数,则 f[n]=2f[n-1]+2f[n-2];

 

#include<stdio.h>
#include<iostream>
#define MAXN 100
using namespace std;

char a[100][100];
//高精度加法 
void add(char a[],char b[],char back[])
{
    int i,j,k,up,x,y,z,l;
    char *c;
    if (strlen(a)>strlen(b)) l=strlen(a)+2; else l=strlen(b)+2;
          c=(char *) malloc(l*sizeof(char));
    i=strlen(a)-1;
    j=strlen(b)-1;
    k=0;up=0;
    while(i>=0||j>=0)
    {
        if(i<0) x='0'; else x=a[i];
        if(j<0) y='0'; else y=b[j];
        z=x-'0'+y-'0';
        if(up) z+=1;
        if(z>9) {up=1;z%=10;} else up=0;
        c[k++]=z+'0';
        i--;j--;
    }
    if(up) c[k++]='1';
    i=0;
    c[k]='\0';
    for(k-=1;k>=0;k--)
    back[i++]=c[k];
    back[i]='\0';
} 
//打表,数据大,用高精度算的 
void test()
{
    a[1][0]='3';a[1][1]='\0';
    a[2][0]='8';a[2][1]='\0';
    for(int i=3;i<=MAXN;i++)
    {
        add(a[i-1],a[i-2],a[i]);
        add(a[i-1],a[i],a[i]);
        add(a[i-2],a[i],a[i]);
    }    
}    
int main()
{
    int n;
    test();
    while(scanf("%d",&n)!=EOF)
    {
        printf("%s\n",a[n]);
    }  
    return 0;  
}    

抱歉!评论已关闭.