波浪数
今天学构造,刷题遇到了一个题,我没明白最后一点(又好像明白了)
洛谷P1112 波浪数
题目描述
波浪数是在一对数字之间交替转换的数,如1212121,双重波浪数则是指在两种进制下都是波浪数的数,如十进制数191919是一个十进制下的波浪数,它对应的十一进制数121212也是一个波浪数,所以十进制数191919是一个双重波浪数。
类似的可以定义三重波浪数,三重波浪数在三种不同的进制中都是波浪数,甚至还有四重波浪数,如十进制300=606(七进制)=363(九进制)=454(八进制)=1A1(十三进制)…,你的任务就是在指定范围内找出双重、三重、四重波浪数。
输入格式
单独一行包含五个用空格隔开的十进制整数,前两个数表示进制的范围(2-32),第三与第四个数表示指定的范围(1-10000000),第五个数为2,3,4中的一个,表示要找的波浪数的重数。
输出格式
从小到大以十进制形式输出指定范围内的指定重数的波浪数。一行输出一个数。
输入输出样例
输入 #1
10 11 190000 960000 2
输出 #1
191919 383838 575757 767676 959595
我看到这道题后就直接打了个暴力,27分。
#include<iostream> using namespace std; int main(){ int a,b,c,d,n; cin>>a>>b>>c>>d>>n; int cnt; for(int i=c;i<=d;i++){ cnt=0; for(int j=a;j<=b;j++){ int t=i; int bl=0; int liang[2]; liang[0]=t%j; t/=j; liang[1]=t%j; t/=j; if(t==0){ continue; } while(t!=0){ int k=t%j; if(k!=liang[bl]){ break; } bl=(bl+1)%2; t=t/j; } if(t==0){ cnt++; } } if(cnt==n){ cout<<i<<endl; } } return 0; }
我觉得这个暴力也没有问题啊,接着我就进入了评论区,没想到一位兄弟解了我燃眉之急。我的算法中将两个相同的数的交替也当做波浪数,如11,111,1111,实际上是错误的。
改后。
#include<iostream> using namespace std; int main(){ int a,b,c,d,n; cin>>a>>b>>c>>d>>n; int cnt; for(int i=c;i<=d;i++){ cnt=0; for(int j=a;j<=b;j++){ int t=i; int bl=0; int liang[2]; liang[0]=t%j; t/=j; liang[1]=t%j; t/=j; if(t==0||liang[0]==liang[1]){ continue; } while(t!=0){ int k=t%j; if(k!=liang[bl]){ break; } bl=(bl+1)%2; t=t/j; } if(t==0){ cnt++; } } if(cnt==n){ cout<<i<<endl; } } return 0; }
我想这得过了吧,91分,于是我又进入了评论区,又没想到,又遇到一位兄弟,里面写了一位数、两位数也是波浪数(他不是这样写的,这里是我总结的),我很疑惑(但如果要理解的话就是题目中没有说交替次数的范围,一次也是可以的,而一位数就是这位数和0的交替),于是我又改了,终于AC。
#include<iostream> using namespace std; int main(){ int a,b,c,d,n; cin>>a>>b>>c>>d>>n; int cnt; for(int i=c;i<=d;i++){ cnt=0; for(int j=a;j<=b;j++){ int t=i; int bl=0; int liang[2]; liang[0]=t%j; t/=j; liang[1]=t%j; t/=j; if(liang[0]==liang[1]){ continue; } while(t!=0){ int k=t%j; if(k!=liang[bl]){ break; } bl=(bl+1)%2; t=t/j; } if(t==0){ cnt++; } } if(cnt==n){ cout<<i<<endl; } } return 0; }