BJTU 锻炼计划

题面描述

老顽童是一个热爱运动的人,每天都有小顽童来和他一起锻炼。为了让锻炼更有成效,他想要制定一份锻炼计划,让第 n 天的训练量要等于第 n 个正回文数 ( 第 1 个正回文数是 1) 。

老顽童已经打印好了计划表,但是他的计划表中有一些日子被遗漏了,他又不想重新计算,你可以帮他解决这个问题吗?

如果一个数的各位数字反向排列后仍然等于其本身,则把这样的数称为回文数 (palindrome number) ,如 12321 是回文数, 1232 不是回文数。

输入数据

第一行有一个整数 t (1 ≤ t ≤ 100000) ,表示有 t 组数据。

每组数据只有一行,为一个整数 n (1 ≤ n ≤ 400000) ,表示第 n 天。

输出数据

对于每组数据,输出一个整数,表示对应的训练量。

样例输入

5
1
2
3
12
23

样例输出

1
2
3
33
141

解题思路

      自然序列中的有序的第N个回文数,400000这个还是蛮大的。在一切循环都会超时的情况下,采用打表的方式,获取有序回文数的构成位数。经过规律探索发现,//*说明:第N个回文数是个num位数,奇数位前半部分front_num =(num+1)/ 2,偶数位前半部分behind_num =num / 2。定位打表的位置后,求出num位数的序号,dif = n - arr[num-1] 。*//

        回文数的前半部分 == {pow(10 , front_num-1)或者}  pow(10 , front_num-1)  + dif - 1 。

        示例:第333个回文数是23432。

                   先打表定位:198 < 333 < 1098 ;表示一个num= 5位数。而且arr[5-1] = 198。

                   那么,dif = 333 - 198 = 135 。

                   那么,前半部分front_num = (5+1)/ 2 = 3 。

                   总述:front = pow(10 , 2) + dif - 1 = 100 + 135 - 1 = 234

         另外:dif = n - arr[num] = 333 - 1098 =  -765 

                   front = pow(10 , front_num)  + dif - 1 = pow(10 , 3) + (-765) - 1 = 1000 - 765 - 1 = 234

        代码一与代码二的原理基本一致,打表求位置。需要注意的是:int整型的长度,求出前半部分front后,直接输出即可,紧接着输出后半部分behind。不要front+behind相加后再输出,会造成超出范围Wrong Answer 。

 

 

程序代码一

#include <iostream>
using namespace std;
void Huiwen(int n){
    int s = 9 , ans = 1 ;
    while(n > s * 2)// 判断第n个数有多少位,原理等同于打表求值
    {
        n -= s * 2 ;
        s *= 10 ;
        ans *= 10 ;
    }
    ans += (n % s == 0 ? s : n % s) - 1 ;// a>b?a:b 说明:a>b为true返回a,否则b
    cout << ans ;// 输出前半部分
    if(n - s <= 0)// n个位数为奇数,去掉最后一位
        ans /= 10 ;
    while(ans)
    {
        cout << ans % 10 ;//输出后半部分
        ans /= 10 ;
    }
    cout << endl ;
}
int main(){
    int t ;// t组数据
    cin >> t ;
    for (int i = 0 ; i < t ; i++){
        int n ;
        cin >> n ;
        Huiwen(n) ;
    }
    return 0 ;
}

 

 

程序代码二 

图中打表的代码,完整版如下

 

int arr[12] = {0 , 9 , 18 , 108 , 198 , 1098 , 1998 , 10998 , 19998 , 109998 , 199998 , 1099998} ;
// 位数表 0-1-2-3-4-5-6-7-8-9-10-11

### 关于北京交通大学计算思维课程的相关资料 #### 课程概述 计算思维是一种解决问题的方法论,强调通过抽象、分解、模式识别以及算法设计来解决复杂问题。在北京交通大学的计算机科学及相关学科的教学体系中,计算思维被广泛应用于基础课程和实践项目之中[^1]。 尽管具体的《计算思维》课程可能未单独列出,但在诸如 **Python程序设计** 和其他编程类课程的设计目标中,均体现了培养学生计算思维能力的核心理念。例如,在“考虑红绿灯的北京市道路网上出租车导航及计费”的课程设计案例中,学生需运用逻辑推理与数据结构知识完成实际应用开发,这正是计算思维的具体体现。 #### 教材与参考资料 虽然具体教材名称未提及,但基于北京交通大学的培养计划可以看出,学校注重理论联系实际的能力训练。以下是可能涉及的内容资源: - Python 编程语言作为入门工具,帮助初学者理解基本语法并构建简单的应用程序。 - 数据结构与算法分析的基础教学材料,用于提升学生的建模能力和优化意识。 - 实验指导书或项目手册,提供类似于上述提到的道路网络模拟场景的任务说明和技术支持文档。 ```python # 示例代码片段展示如何利用图遍历实现路径规划功能 def bfs(graph, start_node): visited = set() queue = [start_node] while queue: current_node = queue.pop(0) if current_node not in visited: visited.add(current_node) neighbors = graph[current_node] for neighbor in neighbors: if neighbor not in visited: queue.append(neighbor) return list(visited) ``` 此段伪代码展示了广度优先搜索(BFS)方法的应用实例之一,它可用于寻找最短路径等问题求解过程中的核心环节[^3]。 #### 学习建议 为了更好地掌握计算思维方式及其应用场景,可参考以下几点提示: - 积极参与各类竞赛活动如ACM/ICPC国际大学生程序设计大赛等; - 加入相关科研团队或者兴趣小组开展深入探索; - 利用在线平台(Coursera、edX)选修知名高校开设的公开慕课(MOOCs),补充专业知识储备。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值