实验题目:
为了奖励牛牛同学帮妈妈解决了大写中文数字的问题,牛牛妈妈特地抽出一个周末的时间带着牛牛来到梦幻儿童乐园游玩。在游乐园,牛牛看到了一个非常有意思的游戏:游戏一开始,电脑屏幕上只有一个序列“A”,而后的每一次变化都把序列中的“A”变成“AB”,“B”变成“A”。游戏一直继续……最后屏幕上得到了序列“ABAABABAABAABABAABA……”。当然更有意思的是,电脑会提出Q个询问,每次询问:在第m个字符和第n个字符之间有多少个“A”(包括第m、n个字符在内)。
输入:第一行为一个整数Q,后面有Q行,每行两个数用空格隔开的整数m,n。
输出:共Q行,每行一个回答(m和n之间有多少个A)。
样例:
1
2 8
4
ABAABABAABAABABAABA……
其中,1≤Q≤5000 1≤m≤n≤2^63。保证每次询问时,所询问的区间已经生成。
提示:
- 分析前若干个字符串,注意分析当前字符串与前两个字符串在长度和内容上的关系
- 相当于分治统计某个区间中指定字符个数
代码:
#include<iostream>
#include<string>
using namespace std;
string init(int x){
string k[5000];
k[0]="A"; //第一个字符串为A
k[1]="AB"; //第二个字符串为AB
for(int i=2;i<x;i++){ //从第3个开始,也就是下标为2的字符串等于前面两个字符串相加,长度也是这个规律,一直遍历到输入的num为止
k[i]=k[i-1]+k[i-2];
}
return k[x-1]; //返回这个字符串数组
}
int Get_Num(string k,int m,int n){
int sum1,sum2,i;
int sum=0;
for(i=0;i<m;i++){
if(k[i]=='A'){
sum1++;
}
}
for(i=0;i<n;i++){
if(k[i]=='A'){
sum2++;
}
}
//区间查找统计比较
if(sum1==sum2)
sum=sum1;
else
sum=sum2-sum1;
return sum; //返回查找总数
}
int main(){
int num,Q,m,n,sum;
string a;
cout<<"请输入您要获取的序列的替换次数:"<<endl;
cin>>num;
cout<<"生成序列为:"<<endl;
a=init(num);
cout<<a<<endl;
cout<<"请输入行数Q:"<<endl;
cin>>Q;
for(int i=1;i<=Q;i++)
{
cout<<"请输入区间m~n:"<<endl;
cin>>m>>n;
sum=Get_Num(a,m,n);
cout<<sum<<endl;
}
return 0;
}
运行截图: