首页 > 代码库 > 度熊全是由1构成的字符串

度熊全是由1构成的字符串

  度熊面前有一个全是由1构成的字符串,被称为全1序列。你可以合并任意相邻的两个1,从而形成一个新的序列。对于给定的一个全1序列,请计算根据以上方法,可以构成多少种不同的序列。Input这里包括多组测试数据,每组测试数据包含一个正整数NN ,代表全1序列的长度。

1N2001≤N≤200
Output对于每组测试数据,输出一个整数,代表由题目中所给定的全1序列所能形成的新序列的数量。Sample Input

1
3
5

Sample Output

1
3
8


        
 

Hint

如果序列是:(111)。可以构造出如下三个新序列:(111), (21), (12)。

#include<stdio.h>
#include<string>
#include<string.h>
#include<iostream>
#include<bits/stdc++.h>
using namespace std;

//compare比较函数:相等返回0,大于返回1,小于返回-1
int compare(string str1,string str2)
{
    if(str1.length()>str2.length()) return 1;
    else if(str1.length()<str2.length())  return -1;
    else return str1.compare(str2);
}
//高精度加法
//只能是两个正数相加
string add(string str1,string str2)//高精度加法
{
    string str;
    int len1=str1.length();
    int len2=str2.length();
    //前面补0,弄成长度相同
    if(len1<len2)
    {
        for(int i=1;i<=len2-len1;i++)
           str1="0"+str1;
    }
    else
    {
        for(int i=1;i<=len1-len2;i++)
           str2="0"+str2;
    }
    len1=str1.length();
    int cf=0;
    int temp;
    for(int i=len1-1;i>=0;i--)
    {
        temp=str1[i]-0+str2[i]-0+cf;
        cf=temp/10;
        temp%=10;
        str=char(temp+0)+str;
    }
    if(cf!=0)  str=char(cf+0)+str;
    return str;
}
//高精度减法
//只能是两个正数相减,而且要大减小
string sub(string str1,string str2)//高精度减法
{
    string str;
    int tmp=str1.length()-str2.length();
    int cf=0;
    for(int i=str2.length()-1;i>=0;i--)
    {
        if(str1[tmp+i]<str2[i]+cf)
        {
            str=char(str1[tmp+i]-str2[i]-cf+0+10)+str;
            cf=1;
        }
        else
        {
            str=char(str1[tmp+i]-str2[i]-cf+0)+str;
            cf=0;
        }
    }
    for(int i=tmp-1;i>=0;i--)
    {
        if(str1[i]-cf>=0)
        {
            str=char(str1[i]-cf)+str;
            cf=0;
        }
        else
        {
            str=char(str1[i]-cf+10)+str;
            cf=1;
        }
    }
    str.erase(0,str.find_first_not_of(0));//去除结果中多余的前导0
    return str;
}
//高精度乘法
//只能是两个正数相乘
string mul(string str1,string str2)
{
    string str;
    int len1=str1.length();
    int len2=str2.length();
    string tempstr;
    for(int i=len2-1;i>=0;i--)
    {
        tempstr="";
        int temp=str2[i]-0;
        int t=0;
        int cf=0;
        if(temp!=0)
        {
            for(int j=1;j<=len2-1-i;j++)
              tempstr+="0";
            for(int j=len1-1;j>=0;j--)
            {
                t=(temp*(str1[j]-0)+cf)%10;
                cf=(temp*(str1[j]-0)+cf)/10;
                tempstr=char(t+0)+tempstr;
            }
            if(cf!=0) tempstr=char(cf+0)+tempstr;
        }
        str=add(str,tempstr);
    }
    str.erase(0,str.find_first_not_of(0));
    return str;
}


const int MAXNX = 200 + 5;
string C[MAXNX];
void init(){
    C[0] = "0";
    C[1] = "1";
    for(int i = 2;i < MAXNX;i ++) C[i] = add(C[i - 1], C[i - 2]);
}

int N;
int main() {
    init();
    while(~scanf("%d", &N)){
        cout << C[N + 1] << endl;
    }
    return 0;
}

 

 

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 using namespace std;
 5 string s[201];
 6 string add(string a,string b)
 7 {
 8     string ans="";
 9     int aa[1000]={0},bb[1000]={0};
10     int aLen=a.size();
11     int bLen=b.size();
12     int MaxLen=max(aLen,bLen);
13     for(int i=0;i<aLen;i++)
14         aa[aLen-i-1]=a[i]-0;
15     for(int i=0;i<bLen;i++)
16         bb[bLen-1-i]=b[i]-0;
17     for(int i=0;i<MaxLen;i++){
18         aa[i]+=bb[i];
19         aa[i+1]+=aa[i]/10;
20         aa[i]%=10;
21     }
22     if(aa[MaxLen]) MaxLen++;
23     for(int i=MaxLen-1;i>=0;i--)
24         ans+=aa[i]+0;
25     return ans;
26 }
27 int main()
28 {
29     int n;
30     s[0]="1",s[1]="1";
31     for(int i=2;i<201;i++){
32         s[i]=add(s[i-1],s[i-2]);
33     }
34     while(cin>>n){
35         cout<<s[n]<<endl;
36     }
37     return 0;
38 }

 

度熊全是由1构成的字符串