以下均为个人编写,肯定有不到之处,也欢迎指正和修改
以下均为Vs2019环境下写的,因此有#define _CRT_SECURE_NO_WARNINGS的宏定义
1 括号匹配
题目描述:编写程序,从终端读入以‘@’为结束符的字符序列(序列总长度不超过1000个字符),检查该字符序列中的(与)、[与] 、{ 与 } 是否匹配(个数相等且位置不相交)。
输入:包含一串以‘@’为结束符的字符串,其间可能包含空白或其它非括号字符。
输出:如果字符串中三类括号匹配,则输出YES;否则输出NO。
输入:
{ a,a }b{ c[cc]c } {a(bb[cc]dd)a}@
输出:
YES
涉及对栈的模仿的一道题,课本原题
#define _CRT_SECURE_NO_WARNINGS
#include"stdio.h"
#include"stdlib.h"
#define size 1000
char stack[size], ch;
int top;
void initial() {
top = 0;
}
bool push(char x)
{
if (top > size - 1)
return false;
else {
stack[top] = x;
top++;
return true;
}
}
char pop()
{
if (top == 0)
return '\0';
else {
top--;
return stack[top];
}
}
void check(char x, char y) {
if (x == '\0' || x == '@')
{
printf("NO");
exit(0);
}
else if (x != y)
{
printf("NO");
exit(0);
}
}
int main()
{
char ch, out; initial();
push('@');
ch = getchar();
while (ch != '@')
{
switch (ch)
{
case'(':
case'{':
case'[':push(ch); break;
case')':out = pop(); check(out, '('); break;
case'}':out = pop(); check(out, '{'); break;
case']':out = pop(); check(out, '['); break;
}
ch = getchar();
}
out = pop();
if (out == '@')
printf("YES");
else printf("NO");
return 0;
}
2
给定若干不完全相同的正整数( < 10000)和n(n < 5),计算这些正整数里面有多少数对满足:其中一个是另一个的n倍。例如:1 4 3 2 9 7 18 22,n = 3时得到的答案是2;因为3是1的3倍,9是3的3倍。
输入:输入第一行给出正整数n的值,接下来包括多组测试数据。每组数据最多100个整数占用一行,以数字0结束(不计入100个整数里)。测试数据不超过20组,最后一行只包括 - 1,表示输入数据结束。
输出:对每组输入数据,输出一行,给出有多少数对满足其中一个是另一个n倍;如果没有满足要求的数对,则输出0。
(注:最后一行末尾无换行符等多余字符)。
输入:
2
1 4 3 2 9 7 18 22 0
2 4 8 8 0
7 5 11 13 1 3 0
-1
Plain Text
输出:
3
3
0
#define _CRT_SECURE_NO_WARNINGS
#include"stdio.h"
int MAX(int a, int b)
{
if (a >= b)
return a;
else return b;
}
int min(int a, int b)
{
if (a >= b)
return b;
else return a;
}
int main()
{
int n, num[101] = {0}, i, m, a[20] = {0}, b, c;//a[]储存结果
scanf("%d", &n);
for (i = 0; i < 20; i++)//i为行数
{
for (m = 0; m <=100; m++)//m为列数
{
scanf("%d", &num[m]);
if (num[m] == 0)
{
for (b = 0; b < m - 1; b++)//数组内数两两取余,得0则a[i]++
{
c = b + 1;
//printf("%d", c);
do {
if (MAX(num[c],num[b]) %min(num[c], num[b] )== 0&&MAX(num[c], num[b]) / min(num[c], num[b])==n)
a[i]=a[i]+1;
//printf("a[i]=%d", a[i]);
c++;
} while (c < m);
}
break;//输入0时终止这次循环
}
if (m == 0 && num[m] == -1)//某行第一个字符为-1循环全部终止进入打印结果的语句
{
goto next;
}
}
}
next:for (m = 0; m < i; m++)
printf("%d\n", a[m]);
}
3、
数组排序
题目描述 : 编写函数,分别采用教材给出的“主元选择排序”、“冒泡排序”和“逐步增加递增子序列”排序(插入排序)方法对给定数组进行排序。综合运用调试方法,观察不同排序方法在排序过程中数组元素值的变化情况,如观察递增排序如下序列{ 9、8、7、6、5、4、3、2、1、0 },{ 0、1、2、3、4、5、6、7、8、9 }和{ 2、9、4、7、6、5、8、3、0、1 }时,数组中元素比较次数、移动或交换次数。
说明:
(1)对于“主元选择排序”和“冒泡排序”,执行完3个赋值操作,计为1次交换。
(2)对于“逐步增加递增子序列”排序,每执行一次while循环的循环条件判断,计为1次比较;如果在某轮比较中元素本身的位置没有变化,则本轮移动次数为0。
(3)因本题目的是观察输出数据,深入理解排序算法;所以样例点和实测点一致。
输入:包含10个整数的待排序数组。
输出