03好容易,不发了。总结一下04,跑步进入了指针,现在感觉前路有点迷茫。考虑是不是要去蓝桥杯挑战一下自己虽然现在还是菜鸡,希望以此激励我不断前进......回头看自己的代码好羞耻啊干,感觉很多可以改一改但是最近超忙所以算了吧。仅作留档以便将来鞭尸我自己。
九成新新手,开打两月。若有错误,拜托指正,非常感谢!
因为用的是vs所以有scanf_s......准备开始尝试dev-c++。
1. (程序题)
题目编号:Exp04-Basic01,GJBook3例-06-13
题目名称:括号匹配
题目描述:编写程序,从终端读入以‘@’为结束符的字符序列,检查该字符序列中的 ( 与 )、 [ 与 ] 、{ 与 } 是否匹配(个数相等且位置不相交)。
输入:包含一串以‘@’为结束符的字符串,其间可能包含空白或其它非括号字符。
输出:如果字符串中三类括号匹配,则输出YES;否则输出NO。
样例1:
输入:
{a,a}b{c[cc]c} {a(bb[cc]dd)a}@
输出: YES
样例2:
输入: {a,a}b{c[cc]c] {a(bb[cc]dd)a}@
输出: NO
#include<stdio.h>
int main()
{
int i, j=1,n=1;
char m[256], q=0;//m[]当作栈
m[0] = 0;
for (;q != '@'; ) {
scanf_s("%c", &q,1);
if (q == '('|| q == '{'|| q == '[') {
m[n] = q;
n++;
}
if (q == ')') {
if (m[n - 1] == '(') {
m[n - 1] = 0;
n--;
}
else j = 0;
}
if (q == ']') {
if (m[n - 1] == '[') {
m[n - 1] = 0;
n--;
}
else j = 0;
}
if (q == '}') {
if (m[n - 1] == '{') {
m[n - 1] = 0;
n--;
}
else j = 0;
}
}
if (j == 1&&n==1) printf("YES");
else printf("NO");
return 0;
}
这题参考了大佬的代码,看了之后开始跑步搞完数组。多看别人的代码,去接触一下些老师不讲的东西,对我打代码的一些意识(?)有了模糊的感觉。
2. (程序题)
题目编号:Exp04-Basic02
题目名称:n倍数关系
题目描述:
给定若干不完全相同的正整数(<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倍。(注:最后一行末尾无换行符等多余字符。)
样例:
输入: 2 1 4 3 2 9 7 18 22 0 2 4 8 10 0 7 5 11 13 1 3 0 -1
输出: 3 2 0
#include<stdio.h>
int a[20][101];
int lyl(int j1, int n) {
int i = 0,t=0,x=0;
for (; i <= 100; i++) {
if (a[j1][i] == 0) continue;
for (x = i+1; x <= 100; x++) {
if (a[j1][i] == n * a[j1][x] || a[j1][x] == n * a[j1][i])
t++;
}
}
return t;
}
int main()
{
int n,i=0,j=0;
int t=0,j1=0,i1=0;
scanf_s("%d", &n);
for (; j <= 19 ; j++) {
for (i=0; i <= 100 ; i++) {
scanf_s("%d", &a[j][i]);
if (a[j][i] == 0)
break;
if (a[j][i] == -1) break;
}
if (a[j][i] == -1) break;
}
for (; j1 <= j - 1; j1++) {
t = lyl(j1, n);
printf("%d", t);
if (j1 != j - 1) printf("\n");
}
return 0;
}
3. (程序题)
题目编号: Exp04-Basic03
题目名称: 数组排序
题目描述: 编写函数,分别采用教材给出的“主元选择排序”、“冒泡排序”和“逐步增加递增子序列”排序方法对给定数组进行排序。综合运用调试方法,观察不同排序方法在排序过程中数组元素值的变化情况,如观察递增排序如下序列{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个整数的待排序数组。
输出:在一行内依次输出,递增排序时,主元排序比较次数 和 移动/交换次数、冒泡排序比较次数 和 移动/交换次数和递增子序列排序比较次数 和 移动/交换次数,相邻数字之间以一个西文空格间隔。
样例1:
输入: 9 8 7 6 5 4 3 2 1 0
输出: 45 9 90 45 54 54
样例2:
输入: 0 1 2 3 4 5 6 7 8 9
输出: 45 9 9 0 9 0
样例3:
输入: 2 2 3 3 5 5 4 4 6 6
输出: 45 9 27 4 13 6
样例4:
输入: 1 0 3 2 5 4 7 6 9 8
输出: 45 9 18 5 14 10
样例5:
输入: 1 2 3 4 5 5 4 3 2 1
输出: 45 9 81 20 29 24
//学习通04 3 数组排列
#include<stdio.h>
int a[10],a3[10],a2[10];
int main()
{
int i, i1, m=0, n=0,a1,j=0;//a1中间值 m比较次数 n交换次数
for (i = 0; i <= 9; i++) {
scanf_s("%d", &a[i]);
a3[i] = a[i];
a2[i] = a[i];
}
//主元
for (i = 0; i <= 9; i++) {
for (i = 0; i < 9; i++) {
j = i;
for (i1 = i + 1; i1 <= 9; i1++) {
if (a[i1] < a[j]) {
j = i1;
}
a1 = a[i];
a[i] = a[j];
a[j] = a1;
m++;
}
n++;
}
}
printf("%d %d", m, n);
m = 0;
n = 0;
//冒泡
//int i, i1, m=0, n=0,a1,j=0;
int x = 1;
while (x == 1) {
x = 0;
for (i = 0; i < 9; i++) {
if (a2[i] > a2[i + 1]) {
a1 = a2[i+1];
a2[i + 1] = a2[i];
a2[i] = a1;
n=n+1;
x = 1;
}
m++;
}
}
printf(" %d %d", m, n);
m = 0;
n = 0;
//for (i = 0; i <= 9; i++) printf("\n%d", a[i]);
//插入排序 计数需另算
//int i, i1, m=0, n=0,a1,j=0;
int y = 0;
for (i = 1; i < 10; i++) {
for (j = i - 1; j >= 0 && a3[j] > a3[i]; j--)m++;
a1 = a3[i];
for (y = i; y > j+1; y--) {
a3[y] = a3[y - 1];
n++;
}
if (j != i - 1) {
a3[j + 1] = a1;
n++;
}
}
m = m + 9;
printf(" %d %d", m, n);
return 0;
}
这题最后一个拖了很久。
4. (程序题)
题目编号:Exp04-Basic04,GJBook3-06-19
题目名称:删除重复元素
题目描述:编写函数,不使用其他辅助数组,把整型数组中重复元素删得只剩一个;所有未被删除元素都保留最先顺序移动到数组前面。
输入:第一行输入数组长度n(≤100),第二行依次从键盘随机输入n个整数作为数组元素值。
输出:已删除重复元素的数组,各元素间以一个西文空格间隔,最后一个元素后无字符。
样例1:
输入: 10 1 1 2 3 3 3 2 1 2 4
输出: 1 2 3 4
样例2:
输入: 10 1 0 2 2 2 2 2 2 2 2
输出: 1 0 2
#include<stdio.h>
int main() {
int a[100], i = 0, n,j=0,t=1;
scanf_s("%d", &n);
for (; i <= n - 1; i++) {
scanf_s("%d", &a[i]);
}
for (i = 0; i <= n - 1; i++) {
for (j = 0; j < i; j++) {
if (a[i] == a[j]) {
a[i] = 0;
break;
}
if (j == i - 1) {
a[t] = a[i];
printf(" %d", a[t]);
t++;
}
}
if (i == 0) printf("%d", a[0]);
}
return 0;
}
//16 mins
记不清了,但是中间很多题都是重样的,很容易,现在这个拖太久了我全忘了......05也蛮简单。
5. (程序题)
题目编号:Exp04-Basic05,GJBook3-06-06
题目名称:转移0元素
题目描述:编写程序,不使用其他辅助数组,把给定整型数组中所有0元素全部移到后面,且所有非0元素的顺序不变。
输入:第一行输入数组长度n(≤100),第二行依次从键盘随机输入n个整数作为数组元素值。
输出:已将所有0元素串到后面的整数数组,各元素间以一个西文空格间隔,最后一个元素后无字符。
样例1:
输入: 10 0 3 1 0 0 0 1 2 3 0
输出: 3 1 1 2 3 0 0 0 0 0
样例2:
输入: 10 0 0 0 0 0 0 1 2 3 4
输出: 1 2 3 4 0 0 0 0 0 0
#include<stdio.h>
int main()
{
int n, a[100], i = 0, j = 0,t=0;
scanf_s("%d", &n);
for (; i <= n - 1; i++) {
scanf_s("%d", &a[i]);
if (a[i] != 0) {
a[t] = a[i];
if (t != i) a[i] =0;
t++;
}
}
for (i = 0; i <= n - 1; i++) {
printf("%d", a[i]);
if (i != n - 1) printf(" ");
}
return 0;
}
6. (程序题)
题目编号 :Exp04-Basic06,GJBook3-06-04
题目名称:循环右移
题目描述:编写程序,不使用其它辅助数组,把一维整型数组中的各个元素循环右移j位。
输入:
第一行输入两个整数,n表示数组长度(0<n<=100),j表示循环右移的位数(j>=0);
第二行依次从键盘随机输入n个整数作为数组元素值。
输出:
循环右移后的整数数组,各元素间以一个西文空格间隔,最后一个元素后无字符。
样例1:
输入: 10 2 1 2 3 4 5 6 7 8 9 0
输出: 9 0 1 2 3 4 5 6 7 8
样例2:
输入: 10 23 1 2 3 4 5 6 7 8 9 0
输出: 8 9 0 1 2 3 4 5 6 7
#include<stdio.h>
int main()
{
int a[100], b, c, j,n;
scanf_s("%d%d", &n,&j);//数组长度 右移位数
for (b = 0; b <= n-1; b++) {
scanf_s("%d", &(a[b]));
}
if (j >= n) j = j % n;
for (b = n - j; b <= n - 1; b++) {
printf("%d", a[b]);
printf(" ");
}
for (b = 0; b < n - j; b++) {
printf("%d", a[b]);
if (b != n - j - 1) printf(" ");
}
return 0;
}
发现学长的博客了,怎么学长那么早就开始栈了(痴呆),在循坏就有了(吧,我记的),路漫漫其修远兮,还有很远。
7. (程序题)
题目编号:Exp04-Basic07,GJBook3-06-01
题目名称:检验矩阵重复元素
题目描述:编写程序判断任意给定n*n的两维整型数组中是否有相同元素。
输入:第一行输入数组行数n(≤10),第二行随机输入n*n个整数作为数组元素值。
输出:如果数组中有相同元素,则输出YES;否则,输出NO。
样例1:
输入: 3 1 2 3 4 5 6 7 8 9
输出: NO
样例2:
输入: 3 1 1 2 3 4 5 6 7 8
输出: YES
#include<stdio.h>
int a[10][10];
int main() {
int n, i = 0, j = 0,j1=0,i1=0,t=0;
scanf_s("%d", &n);
for (j = 0; j <= n-1; j++) {
for (i = 0; i <= n - 1; i++)
scanf_s("%d", &a[j][i]);
}
for (j = 0; j <= n - 1; j++) {
for (i = 0; i <= n - 1; i++) {
for (j1 = j; j1 <= n - 1; j1++) {
for (i1 = i+1; i1 <= n - 1; i1++) {
if (a[j1][i1] == a[j][i] )
t = 1;
}
}
}
}
if (t == 0) printf("NO");
else printf("YES");
return 0;
}
8. (程序题)
题目编号: Exp04-Basic08,GJBook3-06-03
题目名称: 矩阵转置
问题描述: 编写程序,将任意给定n*n的两维整型数组转置。
输入:第一行输入数组行数n(≤10),第二行随机输入n*n个整数作为数组元素值。
输出:按先行后列、从左至右的顺序输出转置后数组内的所有元素,每行n个元素,同一行内的各元素间以一个西文空格间隔;每行最后一个元素除必要的回车换行符外无其它字符。
样例1:
输入: 3 1 2 3 1 2 3 1 2 3
输出: 1 1 1 2 2 2 3 3 3
样例2:
输入: 3 1 1 1 2 2 2 3 3 3
输出: 1 2 3 1 2 3 1 2 3
#include<stdio.h>
int a[10][10];
int main() {
int n, i = 0, j = 0,j1=0,i1=0,t=0;
scanf_s("%d", &n);
for (j = 0; j <= n-1; j++) {
for (i = 0; i <= n - 1; i++)
scanf_s("%d", &a[j][i]);
}
for (i = 0; i <= n - 1; i++) {
for (j = 0; j <= n - 1; j++) {
printf("%d", a[j][i]);
if (j != n - 1) printf(" ");
else printf("\n");
}
}
return 0;
}
9. (程序题)
题目编号:Exp04-Basic09,GJBook3-06-02
题目名称:检验矩阵主对角线对称
题目描述:编写程序,判断任意给定n*n的两维整型数组是否关于主对角线对称。
输入:第一行输入数组行数n(≤10),第二行随机输入n*n个整数作为数组元素值。
输出:如果数组关于主对角线对称,则输出YES;否则输出NO。
样例1:
输入:
3 1 2 3 2 1 2 3 2 1
输出: YES
样例2:
输入:
3 0 0 1 2 1 2 3 2 1
输出: NO
#include<stdio.h>
int a[10][10];
int main() {
int n, i = 0, j = 0,j1=0,i1=0,t=0;
scanf_s("%d", &n);
for (j = 0; j <= n-1; j++) {
for (i = 0; i <= n - 1; i++)
scanf_s("%d", &a[j][i]);
}
for (i = 0; i <= n - 1; i++) {
for (j = 0; j <= n - 1; j++) {
if (a[j][i] != a[i][j]) t = 1;
}
}
if (t == 1) printf("NO");
else printf("YES");
return 0;
}
10. (程序题)
题目编号:Exp04-Basic10,GJBook3-06-12
题目名称:字符串反序
问题描述:编写程序,将给定的字符串反序输出。
输入:一个长度不超过255的字符串,字符串中可能含有空白字符。
输出:反序输出的字符串。
样例1:
输入 A 输出 A
样例2:
输入 123 45 输出 54 321
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
void lyl(char a1[256]) {
int t, i;
char a2[256];
strcpy(a2, a1);
t = strlen(a1);
for (i = t - 1; i >= 0; i--)
a1[i] = a2[t - 1 - i];
}
int main() {
char a[256], i = 0;
gets(a);
//scanf_s("%s", &a,256);
lyl(a);
printf("%s", a);
return 0;
}
大概就是以上几题差不多了。以下的还是花了一点时间的,上面的几个一口气拿一个模板打完的(原谅我的表达混乱)。
11. (程序题)
题目编号:Exp04-Enhance01,GJBook3-06-25
题目名称:规则形式构建集合
题目描述:
设整数集合 M 定义如下:
(1) 1∈M ;
(2) 若 x ∈M , 则 2x+1 ∈M , 3x+1 ∈M ;
(3) 没有别的整数属于集合 M 。
编程序按递增顺序生成并输出集合 M 的前n项
输入:一个正整数n(≤300)。
输出:按递增序列输出n个属于集合M的整数,各数间以一个西文空格间隔;最后一个数后无字符。
样例1:
输入:10
输出:1 3 4 7 9 10 13 15 19 21
样例2:
输入:1
输出:1
#include<stdio.h>
int a[400];
void lyl(int i) {//插入
int i1 = 1, t = 0, k = 0, j = 0;
j = i - 1;
while (a[j] > a[i]) j--;
t = a[i];
for (k = i - 1; k > j; k--) a[k + 1] = a[k];
a[j + 1] = t;
}
void check(int n) {//检查重复
int i = 0, i1 = 0;
for (; i <= n+100; i++) {
if (a[i + 1] == a[i]) {
for (i1 = i + 1; i1 < n + 100; i1++)
a[i1] = a[i1 + 1];
}
}
}
int main() {
int i = 0, x = 1, t = 0;
int n;
scanf_s("%d", &n);
a[i] = 1;
while (t < n+100) {
a[t+1] = 2 * a[i] + 1;
a[t+2] = 3 * a[i] + 1;
lyl(t+1);
lyl(t+2);
i++;
t += 2;
}
check(n);
for (i = 0; i < n; i++) {
if (i != 0) printf(" ");
printf("%d", a[i]);
}
}
12. (程序题)
题目编号 :Exp04-Enhance02,GJBook3-06-26
题目名称:约瑟夫问题(Josephus)
题目描述:
古代某法官要判决 n 个犯人死刑, 他有一条荒唐的逻辑, 将犯人首尾相接排成圆圈,所有计数从1开始; 然后从第 s 个人开始数, 每数到第 m 个犯人,则拉出来处决; 然后再数 m 个,数到的犯人再处决;... ; 但剩下的最后一个犯人可以赦免。编程序,给出处决顺序,并告知哪一个人活下来。
输入:三个正整数 n(≤1000),s和m,都可以使用int类型变量表示。
输出:依次输出被处决人员的编号,每个编号之间用一个西文空格间隔,最后一个编号后无字符。
样例:
输入:6 1 5
输出:5 4 6 2 3 1
#include<stdio.h>
int a[1010];
int table( int m,int n,int w) {
int ma, i;
for (i = 1;i <= m ; i ++) {
while (!a[w]) {
if (w == n + 1) w = 0;
w++;
}
if (i == m) {
a[w] = 0;
break;
}
w++;
if (w == n + 1) w = 0;
}
return w;
}
int main() {
int n, s, m, w = 0, w1 = 0;
int p = 0, i = 0;
int mark = 0;
scanf_s("%d%d%d", &n, &s, &m);
for (i = 1; i <= n; i++) {
a[i] = 1;
}
w = s;
while (p != n ) {
w1=table( m,n,w);
printf("%d", w1);
if (p != n - 1) printf(" ");
w = w1 + 1;
p++;
}
}
13. (程序题)
题目编号 :Exp04-Enhance03,freshman-1006
题目名称:英文翻译自然数
题目描述:按常规英文输出1000以内自然数的英文读法。
输入:每个测试输入包含 1 个测试用例,给出正整数 n(0<= n <1000)
输出:输出占一行:如果 0<= n <1000, 用规定的格式输出 n,所有英文单词小写,最后一个单词后无字符;否则输出ERR。
样例:
输入:123
输出:one hundred and twenty-three
#include <stdio.h>
char data_1[20][10] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten",
"eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" };
char data_2[9][8] = {"ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety" };
int a[3];
int main(void) {
int n, i = 0, n1, t = 0;
scanf_s("%d", &n);
n1 = n;
for (i=0; n1 != 0; i++) {
a[i] = n1 % 10;
n1 /= 10;
t++;
}
if (n < 0 || n >= 1000) printf("ERR");
else {
switch (t) {
case 0:
case 1:printf("%s", data_1[n]); break;
case 2:
if (a[1] == 1) printf("%s", data_1[n]);
else {
printf("%s", data_2[a[1] - 1]);
if (a[0] != 0) printf("-%s", data_1[a[0]]);
}
break;
case 3:
n1 = n % 100;
printf("%s hundred", data_1[a[2]]);
if (a[0] != 0 || a[1] != 0) printf(" and ");
if (a[1] != 0 && a[0] == 0) printf("%s", data_2[a[1] - 1]);
if (a[0] != 0) {
if (a[1] != 1 && a[1] != 0)
printf("%s-%s", data_2[a[1] - 1], data_1[a[0]]);
else
printf("%s", data_1[n1]);
}
break;
}
}
return 0;
}
英语苦手......谁懂,为了一个ninety改了一晚上找不到这组数据到底错哪了......还有一定要多测,我为了找这组错把所有英文输出了然后发现了其中的和ninety无关的巨大错误(跪)。
原来说要打注释的但是忘了......从今天开始我就开始!!!!