吉林大学超星学习通04

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无关的巨大错误(跪)。

原来说要打注释的但是忘了......从今天开始我就开始!!!!

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值