腾讯2017秋招笔试编程题之素数

该博客介绍了如何解决腾讯2017秋招笔试中的一道编程题,题目要求计算有多少对素数的和等于给定的正整数(小于1000)。博主分析了问题的关键点,包括素数的定义、输入判断、遍历检查素数以及如何存储和判断素数对。最终给出了完整的C++代码实现。

题目描述:
给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输入值小于1000。
如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7))

问题分析:
1. 明确素数的概念,素数即除了能被1和本身整除外,不能被其他数整数的自然数
2. 题目中限定输入为正整数,故可使用int类型变量接受输入值,对于正整数和小于1000的限定用if语句做一个判断
3. 检查输入无误后就要取出素数,根据素数定义对输入的树遍历进行判断,遍历输入正整数使用for循环如下:

for(int i = 2; i<dataInput; i++)

再创建一个for循环来作为i的除数如下:

for(int j = 1; j<= i; j++)

当i%j==0时说明i可被j整除,此时要判断j是否等于1和i本身,如果不等于本省,则说明i不是素数,使用bre

### 腾讯季校园编程笔试准备指南 腾讯季校园聘的编程笔试通常涉及算法、数据结构和编程技巧,题目难度适中,但需要考生具备扎实的基础知识和快速解题能力。以下是一些准备方向和技巧: #### 1. **五笔编码问题** 对于类似五笔编码的问题,可以通过字典序排列计算索引或反向查找编码。以下是实现方法: - **输入编码求索引**:根据编码长度和字母范围,计算所有可能的组合数。 - **输入索引求编码**:通过除法和取余操作逐步生成编码。 ```python def encode_to_index(code): letters = 'abcdefghijklmnopqrstuvwxyz' index = 0 for i, c in enumerate(code): index += (letters.index(c) + 1) * (25 ** (len(code) - i - 1)) return index - 1 # 减去偏移量[^1] def index_to_encode(index): letters = 'abcdefghijklmnopqrstuvwxyz' code = [] while index >= 0: code.append(letters[index % 25]) index = index // 25 - 1 return ''.join(reversed(code)) if code else '' # 反转字符串[^1] ``` #### 2. **质数对问题** 质数对问题要求找出两个质数之和等于给定正整数的所有组合。可以使用埃拉托色尼筛法预处理质数列表,然后通过双指针或哈希表优化查找过程。 ```cpp #include <iostream> #include <vector> using namespace std; vector<int> sieve(int n) { vector<bool> is_prime(n + 1, true); is_prime[0] = is_prime[1] = false; for (int i = 2; i * i <= n; ++i) { if (is_prime[i]) { for (int j = i * i; j <= n; j += i) { is_prime[j] = false; } } } vector<int> primes; for (int i = 2; i <= n; ++i) { if (is_prime[i]) primes.push_back(i); } return primes; // 使用筛法生成质数[^3] } int count_prime_pairs(int target) { vector<int> primes = sieve(target); int count = 0; for (size_t i = 0; i < primes.size(); ++i) { for (size_t j = i; j < primes.size(); ++j) { if (primes[i] + primes[j] == target) { count++; } } } return count; // 计算质数对数量[^4] } ``` #### 3. **字符统计与操作** 字符统计问题通常涉及字符串处理和哈希表的应用。例如,统计每个字符的出现次数并进行特定操作。 ```java public class TechGuide { public int minOperations(String str) { int[] map = new int[128]; for (char c : str.toCharArray()) { map[c]++; } int res = 0; for (int i = 'a'; i <= 'z'; i++) { if (map[i] > 1) { res += map[i] / 2; // 每两个字符减少一次操作[^5] } } return res; } } ``` #### 4. **其他常见题型** - **数组与排序**:如寻找数组中的重复元素、最接近目标值的数对等。 - **动态规划**:如背包问题、最长公共子序列等。 - **图论**:如最短路径、连通分量等。 --- ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值