2013年
1. 编写程序,计算 1~20000 之间的质数,输出时要求每行 10 个数。
穷举的代码就不贴出了,下面给出一个时间复杂度O(n)的方法:
质数是从2开始讨论的,不妨先假设所有数都是质数,而任何一个数(包括质数)的 n(n>1) 倍一定不是质数,所以每访问一个数,就把它所有的n倍置为非质数。我们用一个vector< bool > numbers来保存所有数的情况,质数为true,非质数为false。
下面贴代码:
#include <iostream>
#include <vector>
using namespace std;
#define MAX_SIZE 20000
void getPrime(vector<bool> &numbers,vector<int> &primes){
for (int i = 2; i <= MAX_SIZE; i++) { //质数是从2开始讨论的
if (numbers[i] == true) //如果是质数,放入primes向量
primes.push_back(i);
for (int j = i; j <= MAX_SIZE; j += i) //任何一个数的n倍一定不是质数,全部置为false
numbers[j] = false;
}
}
int main(){
vector<bool> numbers(MAX_SIZE,true); //初始化,默认都是质数true
vector<int> primes;
getPrime(numbers, primes);
int count = 0;
for (vector<int>::iterator it = primes.begin();it != primes.end() ;it++){
cout << *it << " ";
count++;
if (count == 10){
cout << endl;
count = 0;
}
}
cout << endl;
return 0;
}
运行结果就不贴出了。
2. 编写简单的加密,解密程序。
在 main()函数中接收需要加密的字符串,进行加密。加密
时,将字符指针+1,Encrpy 的参数为字符指针。解密时将字符指针-1,Decrpy 的参数亦为字符指针。
并没有理解他想干嘛,指针加一减一又不会改变字符串的内容。。。
贴了代码:
#include <iostream>
using namespace std;
void Encrpy(char * p){
++p;
}
void Decrpy(char * p){
--p;
}
int main(){
char s[] = "Boy Next Door.";
Encrpy(s);
cout << "\nAfter encrpy:\n" << s << endl;
Decrpy(s);
cout << "\nAfter decrpy:\n" << s << endl;
return 0;
}
3. 编写如下算法:1.选择排序 2.桶排序
不难,关于桶排序的思想可以自行百度,很有意思的一种排序方式,在某些情况下(比如全是正整数)速度极快。比如下面给出这个桶排序时间复杂度只有O(n),空间复杂度只有O(1)。
#include <iostream>
using namespace std;
//选择排序
void selectSort(int A[],int n){
for (int i = 0; i < n; i++) {
int minPos = i;
for (int j = i; j < n; j++)
if(A[j] < A[minPos])
minPos = j;
int temp = A[i];
A[i] = A[minPos];
A[minPos] = temp;
}
}
//桶排序,只针对正整数
void bucketSort(int A[],int n){
int count[65536] = {0};
for (int i = 0; i < n; i++)
count[A[i]]++;
for (int j = 0; j < 65536; j++)
for (int k = 1; k <= count[j]; k++)
cout << j << " ";
cout << endl;
}
int main(){
int A[10] = {-2,4,3,5,67,34,9,1,6,7};
int B[15] = {2,4,3,5,67,34,9,1,6,7,4,66,101,3,1};
selectSort(A, 10);
cout << "After selectSort:\n";
for (auto const item : A)
cout << item << " ";
cout << endl;
cout << "After bucketSort:\n";
bucketSort(B, 15);
return 0;
}
测试结果:
4. 对应于 ASCII 字符中 33~126 之间的字符,将其转化为 10 进制,8 进制,16 进制,以及 ASCII 码输出到文件,在该文件中依次输出四张 ASCII 表格。
我按照自己的理解把数字33~126按照10 进制,8 进制,16 进制,以及对应的ASCII码输出到文件。下面是具体代码:
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
void printDecimal(ofstream & os); //输出十进制到文件
void printOctal(ofstream & os); //输出八进制到文件
void printHexadecimal(ofstream & os); //输出十六进制到文件
void printASCII(ofstream & os); //输出ASCII码到文件
int main(){
ofstream os("/Users/.../info.txt");
if (!os) {
cerr << "file cannot be opened!" << endl;
exit(EXIT_FAILURE);
}
printDecimal(os);
printOctal(os);
printHexadecimal(os);
printASCII(os);
cout << "Finish.\n";
return 0;
}
void printDecimal(ofstream & os){
int count = 0;
os << "Decimal:\n";
for (int i = 33; i <= 126; i++) {
os << setw(4) << i << " ";
count++;
if (count == 15) {
count = 0;
os << endl;
}
}
}
void printOctal(ofstream & os){
int count = 0;
os << "\n\nOctal:\n";
for (int i = 33; i <= 126; i++) {
os << setw(4) << oct << setfill('0') << i << " ";
count++;
if (count == 15) {
count = 0;
os << endl;
}
}
}
void printHexadecimal(ofstream & os){
int count = 0;
os << "\n\nHexadecimal:\n";
for (int i = 33; i <= 126; i++) {
os << setw(4) << hex << setfill('0') << i << " ";
count++;
if (count == 15) {
count = 0;
os << endl;
}
}
}
void printASCII(ofstream & os){
int count = 0;
os << "\n\nASCII:\n";
for (int i = 33; i <= 126; i++) {
os << setw(3) << right << dec << setfill(' ') << i << ":" << char(i) << " ";
count++;
if (count == 15) {
count = 0;
os << endl;
}
}
}
输出结果如下:
善用< iomanip >中的流操纵符,忘掉 printf 和 sprintf 吧。
比较常见的流操纵符,可以参考
http://blog.csdn.net/qq_32925781/article/details/79333715
这篇文章。
5. 处理字符串(025)87234865-987,用 strtok 处理,以“区号 电话 分机号”的格式输出。
定义函数:char * strtok(char *s, const char *delim);
函数说明:strtok()用来将字符串分割成一个个片段。参数 s 指向欲分割的字符串,参数delim 则为分割字符串,当strtok()在参数 s 的字符串中发现到参数delim 的分割字符时则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s 字符串,往后的调用则将参数 s 设置成NULL。每次调用成功则返回下一个分割后的字符串指针。
返回值:返回下一个分割后的字符串指针,如果已无从分割则返回NULL。
下面给出具体代码:
#include <cstring>
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
char s[] = "(025)87234865-987";
char * temp;
temp = strtok(s + 1,")");
int area = stoi(temp); //可以用atoi(),效果一样
temp = strtok(NULL,"-");
int telephone = atoi(temp);
temp = strtok(NULL,"\0");
int divide = atoi(temp);
cout << setw(3) << setfill('0') << area << " " << telephone << " " << divide << endl;
return 0;
}
测试结果为:
使用string中的substr()函数也能做到。
6. 已知:Person 类
已知:Person 类包含 3 个数据成员(name,nationality,sex)和三个成员函数(构造函数,printName 函数和 printNationality 函数),其中 name 的数据类型为 Name 类。 Name 类包含三个数据成员(first,middle,last)和两个成员函数(构造函数和 printName 函数) 定义 Person 类和 Name 类,并编写程序测试这两个类的所有接口。
这道题与2012年的最后一题一样,参考这篇博文即可:
http://blog.csdn.net/qq_32925781/article/details/79399352