天梯赛L1-058 6翻了
一、问题描述
“666”是一种网络用语,大概是表示某人很厉害、我们很佩服的意思。最近又衍生出另一个数字“9”,意思是“6翻了”,实在太厉害的意思。如果你以为这就是厉害的最高境界,那就错啦 —— 目前的最高境界是数字“27”,因为这是 3 个 “9”!
本题就请你编写程序,将那些过时的、只会用一连串“6666……6”表达仰慕的句子,翻译成最新的高级表达。
输入格式:
输入在一行中给出一句话,即一个非空字符串,由不超过 1000 个英文字母、数字和空格组成,以回车结束。
输出格式:
从左到右扫描输入的句子:如果句子中有超过 3 个连续的 6,则将这串连续的 6 替换成 9;但如果有超过 9 个连续的 6,则将这串连续的 6 替换成 27。其他内容不受影响,原样输出。
输入样例:
it is so 666 really 6666 what else can I say 6666666666
输出样例:
it is so 666 really 9 what else can I say 27
二、设计思路
(1)从键盘接收一个字符串s;
(2)遍历字符串s,如果不是6则直接输出,如果是6,对应记录器k的值++;
(3)在每次接收完一连串6之后对k的值进行判断,如果k<=3,则输出k个6并将k置为0,如果k>3&&k<=9,将一串字符串替换成9并将k置为0,如果k>9,则输出27并将k置为0;
(4)特殊情况:考虑字符串的最后全是6,需要单独给出解决方法,在这种情况下k>0,再按照(3)中的方法相应进行输出;
三、程序流程图
四、伪代码
五、代码
1 #include <iostream> 2 using namespace std; 3 int main() 4 { 5 string s; 6 getline(cin,s); 7 int k=0; //记录6的个数 8 for(int i=0;i<s.length();i++) 9 { 10 if(s[i]=='6') 11 { 12 k++; 13 } 14 else 15 { 16 if(k<=3) 17 { 18 for(int j=0;j<k;j++) 19 { 20 cout<<"6"; 21 } 22 } 23 else if(k>3&&k<=9) 24 { 25 cout<<"9"; 26 } 27 else if(k>9) 28 { 29 cout<<"27"; 30 } 31 k=0; 32 cout<<s[i]; 33 } 34 } 35 if(k>0) 36 { 37 if(k<=3) 38 { 39 for(int i=0;i<k;i++) 40 { 41 cout<<"6"; 42 } 43 } 44 else if(k>3&&k<=9) 45 { 46 cout<<"9"; 47 } 48 else if(k>9) 49 { 50 cout<<"27"; 51 } 52 } 53 return 0; 54 }
六、总结
(1)getline(cin,s)函数可以接收带空格的字符串;
(2)遍历字符串每个元素可用for循环,字符串长度s.length();
(3)特殊情况需要注意单独考虑,此题中需要考虑最后一串是若干个6的情况,完成对应的输出;
(4)涉及到若干个相同元素在一起对应不同输出情况的时候,可以用k作为计数器,来进行相应的输出,之后将计数器k置为0,继续使用,直到完成要求;