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;
}
最后一个走迷宫没写》。
下一篇: 你的生命的颜色原来是这样的性格?