波浪数c++

该博客讨论了如何在给定范围内找到双重、三重、四重波浪数的问题,这是一种在不同进制下都是波浪数的数字。博主分享了在考场遇到此问题时的困境以及后续理解到的解决思路,即首先生成所有波浪数,然后筛选出具有特定重数的波浪数,指出这种方法避免超时且简化了代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

波浪数是在一对数字之间交替转换的数,如12121211212121,双重波浪数则是指在两种进制下都是波浪数的数,如十进制数 191919191919 是一个十进制下的波浪数,它对应的十一进制数 121212121212 也是一个波浪数,所以十进制数 191919191919 是一个双重波浪数。

类似的可以定义三重波浪数,三重波浪数在三种不同的进制中都是波浪数,甚至还有四重波浪数,如 300(10)=606(7)=363(9)=454(8)=1�1(13)300(10)​=606(7)​=363(9)​=454(8)​=1A1(13)​,下标表示采用的进制。你的任务就是在指定范围内找出双重、三重、四重波浪数。

输入格式

单独一行包含五个用空格隔开的十进制整数 �,�,�,�,�l,r,L,R,k。[�,�][l,r] 表示应当考虑的进制的范围,[�,�][L,R] 表示应当考虑的数字的范围,�k 表示你应该找的波浪数的重数。

输出格式

从小到大以十进制形式输出指定范围内的指定重数的波浪数。一行输出一个数。

输入输出样例

输入 #1复制

10 11 190000 960000 2

输出 #1复制

191919
383838
575757
767676
959595

说明/提示

数据范围及约定

对于全部数据,保证 2≤�≤�≤322≤l≤r≤32,1≤�≤�≤1071≤L≤R≤107,�∈{2,3,4}k∈{2,3,4}。

老师出了一张pj模拟卷

第二题就是这玩意。。。。

考场上的我一看到进制转换就瘫了。。。。。

考完之后才又去写了一遍

发现它的核心思想并不是题目所说的那样去判断不同进制的“波浪”

逆向思维一下

其实我们应该先生成所给范围内的波浪数

(就是把每个波浪数打出来存进一个装‘重数’的数组里)

然后直接遍历数组输出想要的重数的数就行啦

这样不仅不会超时而且代码也更容易实现

(咋考试时就想不到呢。。。。。。)

本人拙码:

#include<bits/stdc++.h>
using namespace std;
int a,b,l,r,c,t,x;
int v[10000005];//存储重数 
int main(){
	memset(v,0,sizeof(v));
	scanf("%d%d%d%d%d",&a,&b,&l,&r,&c);
	for(int k=a;k<=b;++k){
		for(int i=1;i<k;++i){
			for(int j=0;j<k;++j){
				if(i!=j)//不能是相同的数波浪
				{
				x=0;
				t=0;
				while(x<=r){
					if(t%2==0){
						x=x*k+i;
						++t;
					}
					else{
					    x=x*k+j;
					    ++t;
					}
					if(x>=l&&x<=r) ++v[x];
				}
				}
			}
		}
	}
	for(int i=l;i<=r;++i){
		if(v[i]==c) printf("%d\n",i);
	}
} 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值