一、统计回文题

题目描述:

某一天,Alice 比较无聊,于是她为自己发明了一个游戏玩。首先她在纸上画了一个圆,然 后从这个圆的圆弧上均匀地取出 n 个点,这 n 个点将圆 n 等分。接下来,Alice 每次从这 n 个点中选取两个点,在这两个点之间画一条线段,但是要求这条线段不能与已有的线段相交 (允许在端点处相交)。为了能打发更多的时间,Alice 希望能画尽量多的线段,请你告诉她 最多她能画出几条线段?(n<=2<=10^9)

 分析题目,可以看出规律,线条最多数量为2n-3.

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        int count=0;
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        count=2*n-3;
        System.out.println(count);
    }
}

 

### 蓝桥杯竞赛中的回文相关真及解法 #### 回文的概念及其应用 回文是指正读和反读都相同的字符串或数字。在编程领域,判断个数是否为回文通常涉及将其转换为字符串并比较其反转形式[^3]。 以下是基于蓝桥杯竞赛中可能遇到的回文相关的目以及对应的解决方案: --- #### :判断回文数 **描述**: 给定个整数 \( N \),判断它是否是回文数。 **输入**: 个整数 \( N \) (\( 1 \leq N \leq 10^9 \)) **输出**: 如果是回文数,则返回 `True`;否则返回 `False`。 **解法**: 可以通过将数字转化为字符串来实现简单的回文检测逻辑。具体方法如下: 1. 将数字转为字符串; 2. 比较原字符串其反转后的字符串是否相等。 ```python def is_palindrome(n): s = str(n) return s == s[::-1] # 测试样例 print(is_palindrome(12321)) # True print(is_palindrome(12345)) # False ``` 此方法的时间复杂度为 \( O(k) \),其中 \( k \) 是数字的位数。 --- #### 目二:生成回文数 **描述**: 输入个整数 \( n \),生成由该数构成的最大回文数。 **输入**: 整数 \( n \) **输出**: 构造出的个最大回文数。 **解法**: 通过提取前半部分数字并镜像复制到后半部分即可构建完整的回文数。例如,对于数字 `123`,可以构造出回文数 `12321` 或 `123321`。 ```python def generate_palindrome(n): half = str(n) palindrome = int(half + half[::-1]) # 前半部分加反转的部分 return palindrome # 测试样例 print(generate_palindrome(123)) # 输出 12321 ``` 这种方法利用了字符串操作的特,时间复杂度同样为 \( O(k) \)。 --- #### 目三:统计区间内的回文数 **描述**: 给定两个整数 \( L \) 和 \( R \),计算闭区间 \([L, R]\) 中有多少个回文数。 **输入**: 两个整数 \( L \), \( R \) (\( 1 \leq L \leq R \leq 10^6 \)) **输出**: 区间内回文数的总数。 **解法**: 遍历给定范围内的所有数字,并逐检查它们是否为回文数。为了优化性能,可以直接生成所有的回文数而无需逐遍历。 ```python def count_palindromes(L, R): def is_palindrome(x): s = str(x) return s == s[::-1] count = 0 for num in range(L, R + 1): if is_palindrome(num): count += 1 return count # 更高效的版本——直接生成回文数 def generate_all_palindromes(limit): palindromes = [] digits = 1 while (first_half := pow(10, digits - 1)): for first in range(first_half, min(limit, pow(10, digits))): second = int(str(first)[-digits:]) candidate = int(f"{str(first)}{str(second)[::-1]}") if candidate <= limit and candidate >= first_half * 10: palindromes.append(candidate) digits += 1 return sorted(palindromes) # 使用预理好的列表快速查询 palindrome_list = generate_all_palindromes(int(1e6)) count_in_range = sum(1 for p in palindrome_list if L <= p <= R) # 测试样例 print(count_palindromes(1, 100)) # 输出 18 ``` 上述代码展示了两种不同的思路:暴力枚举和预先生成回文数表。后者适用于多次查询的情况,能够显著提升效率。 --- #### 总结 以上介绍了三种典型的关于回文数的问及其解决方法。这些问是蓝桥杯竞赛中常见的考察,涵盖了基本概念的理解、简单算法的设计以及更复杂的优化技巧。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值