欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C程序设计进阶_期末考试

程序员文章站 2022-05-19 14:23:06
...

编程题#1:含k个3的数(简单,但查到了一些东西)
输入二个正整数m 和 k,其中1 < m < 100000,1 < k <5 ,判断m 能否被19整除,且恰好含有k个3,如果满足条件,则输出YES,否则,输出NO。

例如,输入:

43833 3

满足条件,输出YES

如果输入

39331 3

尽管有3个3,但不能被19整除,也不满足条件,应输出NO
输入

m 和 k 的值,空格间隔
输出

满足条件时输出 YES,不满足时输出 NO

#include <iostream>
using namespace std;

int main() {
    int m, k;
    cin >> m >> k;
    int flag = 1,num_3=0;
    if (m % 19 == 0);
    else
        flag = 0;//先判断能否被19整除,flag标志
    for (int i = 0; m>0; i++) {
        if (m%10==3)
            num_3 += 1;
        m /= 10;
    }//看每一位有没有3,这里本来用的itoa,但poj通不过》。

    if (num_3 ==k);
    else
        flag = 0;
    if (flag)cout << "YES" << endl;
    else cout << "NO" << endl;
    return 0;
}



1.itoa实现数字到字符串格式转换

#include <stdlib.h>
itoa(num,str,10);//str给个指针就行,10是进制数 

char*itoa(int value,char*string,int radix);
int value 被转换的整数,char *string 转换后储存的字符数组,int radix 转换进制数,如2,8,10,16 进制等
itoa操作使用
itoa操作使用
头文件: <stdlib.h>

2.另有sprintf也可完成类似功能,没有试,暂时不管
3.0到9的ASCII码是48+i,本来想用这个转字符串的,后来发现这题不需要转字符串》。

编程题#2:字符串中次数第2多的字母(不难)
输入一串长度不超过500个符号的字符串,输出在串中出现第2多的英语字母(大小写字母认为相同)和次数(如果串中有其它符号,则忽略不考虑)。如果有多个字母的次数都是第2多,则按串中字母出现的顺序输出第1个。

例 ab&dcAab&c9defgb

这里,a 和 b都出现3次,c和d都出现2次,e、f 和 g 各出现1次,其中的符号&和9均忽略不考虑。因此,出现第2多的应该是 c 和 d,但是 d 开始出现的位置在 c 的前面,因此,输出为

D+d:2

(假定在字符串中,次数第2多的字母总存在)
输入

一个字符串
输出

大写字母+小写字母:个数

#include <iostream>
#include <cstring>
using namespace std;

int second(int a[]) {//找第二多的,即次数第二大,用两次找max
    int max = a[0];
    int maxNum = 0;
    for (int i = 0; i < 26; i++) {
        if (a[i] > max) {
            max = a[i];
            maxNum = i;
        }
    }
    for (int i = 0; i < 26; i++) {
        if (a[i] == max)
            a[i] = 0;
    }
    max = 0;
    for (int i = 0; i < 26; i++) {
        if (a[i] > max) {
            max = a[i];
            maxNum = i;
        }
    }
    return max;
}

int main() {
    char str[500];
    cin.getline(str,500);
    int len = strlen(str);
    int a[26] = { 0 };//a[0]对应'a'的出现次数,以此类推
    for (int i = 0; i < len; i++) {
        if (str[i] >= 'a'&&str[i] <= 'z') {
            a[str[i] - 'a']++;
        }
        if (str[i] >= 'A'&&str[i] <= 'Z') {
            a[str[i] - 'A']++;
        }
    }
    int sec_num = second(a);//找到第二多的,sec_num存第二大的出现次数

    char b[26] = {};
    for (int i = 0,j =0; i< 26; i++) {
        if (a[i] == sec_num) {
            b[j] = 'a' + i;
            j++;
        }
    }//b中存第二多的字母,因为可能不止一个

    int len2 = strlen(b);
    char sec=0;

    for (int i = 0; i < len; i++) {
        for (int j = 0; j < len2; j++) {
            if (str[i] == b[j]||str[i]+'a'-'A'==b[j]) {
                sec = b[j];
                break;
            }
        }
        if (sec != 0)
            break;
    }//找到第一个出现的第二多字母
    char upper = sec - 32;
    cout << upper << '+' << sec << ':' << sec_num << endl;
    return 0;
}

感觉写的结构不太好。

编程题#4:寻找平面上的极大点(不难,但中间出了点小错找了很久)
在一个平面上,如果有两个点(x,y),(a,b),如果说(x,y)支配了(a,b),这是指x>=a,y>=b;

用图形来看就是(a,b)坐落在以(x,y)为右上角的一个无限的区域内。

给定n个点的集合,一定存在若干个点,它们不会被集合中的任何一点所支配,这些点叫做极大值点。

编程找出所有的极大点,按照x坐标由小到大,输出极大点的坐标。

本题规定:n不超过100,并且不考虑点的坐标为负数的情况。
输入

输入包括两行,第一行是正整数n,表示是点数,第二行包含n个点的坐标,坐标值都是整数,坐标范围从0到100,输入数据中不存在坐标相同的点。
输出

按x轴坐标最小到大的顺序输出所有极大点。

输出格式为:(x1,y1),(x2,y2),…(xk,yk)

注意:输出的每个点之间有”,”分隔,最后一个点之后没有”,”,少输出和多输出都会被判错

#include <iostream>
using namespace std;

int main() {
    int num;
    int a[100][2];
    cin >> num;
    for (int i = 0; i < num; i++)
        cin >> a[i][0] >> a[i][1];//输入

    int b[100][2] = { 0 };
    int flag = 1,k = 0;
    int (*p)[2] = b;//本打算用指针,但这行没有用
    for (int i = 0; i < num; i++) {
        for (int j = 0;j < num; j++) {
            if (j!=i&&a[i][0] <= a[j][0] && a[i][1] <= a[j][1]) {
                flag = 0;
                break;
            }//这里,开始少了j!=i导致一直输出错
        }
        //cout << flag << endl;调了很长时间才想起来看下这个flag,以后记得可能有问题的地方直接cout看下变量值
        if (flag == 1) {
            b[k][0] = a[i][0];
            b[k][1] = a[i][1];
            /*
            *(p + k)[0] = a[i][0];
            *(p + k)[1] = a[i][1];
            */
            k++;
        }
        flag = 1;

    }//极大点存b里面
    int c[100][2];
    int max = a[0][0], maxNum = 0;
    for (int i = 0; i < k; i++) {
        for(int j=0;j<k;j++){
            if (b[j][0] > max) {
                max = b[j][0];
                maxNum = j;
            }
        }
        c[i][0] = b[maxNum][0];
        c[i][1] = b[maxNum][1];
        max = -1;
        b[maxNum][0] = -1;
    }//b里面的坐标排序,从大到小排c里面

    for (int i = k - 1; i >= 1; i--)
        cout << '(' << c[i][0] << ',' << c[i][1] << ')' << ',';
    cout << '(' << c[0][0] << ',' << c[0][1] << ')'<<endl;
    return 0;
}

最后一个走迷宫没写》。