波浪数

今天学构造,刷题遇到了一个题,我没明白最后一点(又好像明白了)

 洛谷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;
}

 

posted @ 2022-02-11 20:47  zzzzzz2  阅读(401)  评论(0编辑  收藏  举报