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

编程题#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;
}

最后一个走迷宫没写》。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值