2013年复试程序设计题

14 篇文章 4 订阅

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值