2014年武汉大学计算机复试上机题

Q1编写程序可计算如下分段函数:


函数图
int main() {
    double x, y;
    while (scanf("%lf", &x) != EOF) {
        if (x > 0) {
            double fz = sqrt(x) + exp(x);
            double fm = 5 * x + 5;
            double ans = fz / fm;
            printf("%f\n", ans);
        } else {
            double PI = acos(-1.0);
            double left = (double) 2 / 3 + sin(PI/3);
            double ans = left * fabs(x);
            printf("%f\n", ans);
        }
    } 
    return 0;
}

Q2. 从键盘输入一个字符串,将此字符串按字符的ASCII码值从小到大排序,并显示排序后的字符串。

int main() {
    char str[100010];
    while (gets(str)) {
        int len = strlen(str);
        for (int i = 0; i < len; i++) {
            for (int j = 0; j < len - i - 1; j++) {
                if (str[j] > str[j + 1]) {
                    char temp = str[j];
                    str[j] = str[j + 1];
                    str[j + 1] = temp;
                }
            }
        }
        printf("%s\n", str);
    }
    return 0;
}

Q3. 编写程序显示2-1000之间的说有完数,所谓完数是指,该数的各因子之和正好等于该数本身。

int main() {
    char str[10010];
    while (gets(str)) {
        int len = strlen(str);
        bool flag = true;
        if ((len >= 10) && (str[0] >= 'A' && str[0] <= 'Z') || (str[0] >= 'a') && str[0] <= 'z') {
            int count[10] = {0};
            for (int i = 0; i < len; i++) {
                if (str[i] == '=' || str[i] == '*') {
                    flag = false;
                    break;
                }
                if (str[i] >= '0' && str[i] <= '9') {
                    int n = str[i] - '0';
                    count[n]++;
                }
            }
            int sum = 0;
            for (int i = 0; i < 10; i++) {
                if (count[i] > 0) {
                    sum++;
                }
            }
            if (sum < 2 || sum > 6) {
                flag = false;
            } 
        } else {
            flag = false;
        }
        if (flag) {
            printf("%s是合法用户名\n", str);
        } else {
            printf("%s是不合法用户名\n", str);
        }
    }
    return 0;
}

Q5. 显示5阶的魔方阵
N阶魔方阵是:元素为自然数1,2,…,N2的N×N方阵,每个元素值均不相等,每行、每列以及主、副对角线上各N个元素之和相等。
例如3阶魔方阵为:
8 1 6
3 5 7
4 9 2
提示:从1开始,依次放置各自然数,Dole Rob算法可以确定插入的每一个元素的下标:
1) 第一个位置在第一行的正中。
2) 若最近一个插入元素为N的整数倍,则选下一行同列上的位置为新位置。
3) 新位置处于最近一个插入位置的右上方。
4) 若超出方阵上边界,则选该列的在最后一行的位置,若超过右边界,则选择该行的在最左一列的位置。
参考示例的3阶魔方阵,理解算法提示,并编程实现。

int main() {
    int a[5][5] = {0};
    int row = 0, col = 5 / 2;
    a[row][col]= 1;
    for (int i = 2; i <= 25; i++) {
        if ((i - 1) % 5 == 0) {
            //N的整数倍在下一行的同一列 
            row++;
            a[row][col] = i;
        } else {
            //新位置在右上方 
            row--;
            col++;
            if (row < 0) {
                row = 4;
            }
            if (col > 4) {
                col = 0;
            }
            a[row][col] = i;
        }
    }
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            printf("%2d ", a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

Q6. 用递归实现,显示用1分、2分和5分的硬币凑成1元,一共有多少种方法。

int ans = 0;
int a[3] = {5, 2, 1};
void func (int m, int n) {
    if (m == 0) {
        ans++;
        return;
    }
    for (int i = n; i < 3; i++) {
        if (m >= a[i]) {
            func(m - a[i], i);
        }
    }
}
int main() {
    func(100, 0);
    printf("%d", ans);
    return 0;
}

你可能感兴趣的:(2014年武汉大学计算机复试上机题)