湖南中医药大学OJ—1190到1199

1190: 习题6-2 排序

题目描述
从键盘上输入10个整数,按照从小到大的顺序对这10个数排序。
采用选择法进行排序。
输入
输入以空格分隔的10个整数
输出
按从小到大排好序的10个数,每个数一行。

样例输入
1 8 6 3 4 2 9 0 7 5
样例输出
0
1
2
3
4
5
6
7
8
9
提示:
选择排序的基本思想是:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。
基本思想:第1趟,在待排序记录r[1]r[n]中选出最小的记录,将它与r[1]交换;第2趟,在待排序记录r[2]r[n]中选出最小的记录,将它与r[2]交换;以此类推,第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。
以下为简单选择排序的存储状态,其中大括号内为无序区,大括号外为有序序列:
初始序列:{ 49 27 65 97 76 12 38 }
第1趟:12与49交换:12 { 27 65 97 76 49 38 }
第2趟:27不动 :12 27 { 65 97 76 49 38 }
第3趟:65与38交换:12 27 38 { 97 76 49 65 }
第4趟:97与49交换:12 27 38 49 { 76 97 65 }
第5趟:76与65交换:12 27 38 49 65 { 97 76 }
第6趟:97与76交换:12 27 38 49 65 76 97 完成
注意C语言数组的下标是从0开始的。

题目的提示已经有了选择排序的提示,关于排序还有很多算法,冒泡、插入、快速、归并等等,可以参考这篇博客:https://blog.csdn.net/qq_43477024/article/details/108523286

下面的代码不一定是选择排序,当时我好像并没用什么算法思想去做

#include<stdio.h>
#include<math.h>
int main()
{
    
    
    int a[10],i,j,t;
    for(i=0;i<10;i++)
    {
    
    
        scanf("%d",&a[i]);
    }
    for(i=0;i<9;i++)
        for(j=i+1;j<10;j++)
        {
    
    
            if(a[j]<a[i])
            {
    
    
                t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
        }
    for(i=0;i<10;i++)
        printf("%d\n",a[i]);
    return 0;
}

1191: 习题6-3 求整型矩阵对角线元素之和

题目描述
求一个3×3的整型矩阵对角线元素之和。
输入
从键盘上输入3×3的整型矩阵,要求输入3行,每行3个整数,每个数之间以空格分隔
输出
对角线元素之和,行尾换行。

样例输入 Copy
1 2 3
4 5 6
9 8 7
样例输出 Copy
13
提示
3×3的整型矩阵用一个3行3列的二维整型数组来描述。
若二维整型数组定义为int a[3][3],则对角线元素即为a[i][i],i=0, 1, 2

这个题直接将a[i][i]类型的数据加起来就可以了

#include<stdio.h>
#include<math.h>
int main()
{
    
    
    int a[3][3],i,j,x,t=0;
    for(i=0;i<3;i++)
    {
    
    
        for(j=0;j<3;j++)
        {
    
    
            scanf("%d",&a[i][j]);
        }
    }
    t=a[0][0]+a[1][1]+a[2][2];
    printf("%d\n",t);
    return 0;
}

1192: 习题6-4 有序插入

题目描述
有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入到数组中。
假设数组长度为10,数组中前9个数(这9个数要求从键盘上输入,输入时要满足自小到大的输入顺序)已经按从小到大进行排序。
然后再从键盘上输入一个整数,将此整数插入到前有序的9个数中,使得最终的10个数依然是从小到大有序的。
输入
第一行输入以空格分隔的9个整数数,要求按从小到大的顺序输入。
第二行输入一个整数
输出
从小到大输出这10个数,每个数一行。

样例输入 Copy
1 11 21 31 41 51 61 71 81
45
样例输出 Copy
1
11
21
31
41
45
51
61
71
81
提示
定义数组时,把数组长度定义为10.

#include<stdio.h>
#include<math.h>
int main()
{
    
    
    int a[10],b[10],i,j,x,t=0;
    for(i=0;i<9;i++)
    {
    
    
        scanf("%d",&a[i]);
    }
    scanf("%d",&x);
    for(i=0;i<10;i++)
    {
    
    
        if(a[i]>x&&x>a[i-1])
            t=i;///在此位插入,标记需要插入的位置
    }
    //下面的两个for循环的工作就是将t这个位置以后的数据全部往后移一位,把a[t]空出来
    for(j=t+1,i=t;j<10;j++,i++)
    {
    
    
        b[j]=a[i];//b数组就是一个空数组,用来存放a里面的数据
    }
    for(j=0,i=0;j<t;j++,i++)
    {
    
    
        b[j]=a[i];
    }
    b[t]=x;//再把x放到t位置上
    for(i=0;i<10;i++)
        printf("%d\n",b[i]);
    return 0;
}

1193: 习题6-5 数组元素逆置

题目描述
将一个长度为10的整型数组中的值按逆序重新存放。
如:原来的顺序为1,2,3,4,5,6,7,8,9,0,要求改为0,9,8,7,6,5,4,3,2,1
输入
从键盘上输入以空格分隔的10个整数。
输出
按相反的顺序输出这10个数,每个数占一行。

样例输入 Copy
1 2 3 4 5 6 7 8 9 0
样例输出 Copy
0
9
8
7
6
5
4
3
2
1

#include<stdio.h>
#include<math.h>
int main()
{
    
    
    int a[10],b[10],i,j;
    for(i=0;i<10;i++)
    {
    
    
        scanf("%d",&a[i]);
    }
    for(j=0,i=9;j<10,i>=0;j++,i--)//就是将a数组里面的数据,逆序输出到b数组
    {
    
    
        b[j]=a[i];
    }
    for(i=0;i<10;i++)
        printf("%d\n",b[i]);//然后输出b数组就得到了结果
    return 0;
}

1194: 习题6-6 杨辉三角

题目描述
按要求输出如下格式的杨辉三角
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
最多输出10层。
输入
输入只包含一个正整数n,表示将要输出的杨辉三角的层数。
输出
对应于该输入,请输出相应层数的杨辉三角,每一层的整数之间用一个空格隔开。

样例输入 Copy
5
样例输出 Copy
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

for循环+数组的应用

#include<stdio.h>
#include<math.h>
int main()
{
    
    
    int a[15][15]={
    
    0},n,i,j;
 
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
    
    
        a[i][1]=1;//每一行的首位都是1
        for(j=1;j<i;j++)//循环每行,给每行赋值
        {
    
    
            a[i][i]=1;//最外边的一层也都是1
            a[i+1][j+1]=a[i][j]+a[i][j+1];//其他数据都是左上方的数+上方的数
        }
 
    }
    for(i=1;i<=n;i++)//输出
    {
    
    
        if(i!=1)
            printf("\n");
        for(j=1;j<=i;j++)
        {
    
    
            printf("%d ",a[i][j]);
        }
    }
 
    return 0;
}

1195: 习题6-9 折半查找

题目描述
有10个整数已按从小到大的顺序排好序,存储在一个数组中,再输入一个数,要求用折半查找法找出该数是数组中的第几个元素(输出该元素的下标即可)。如果该数不在数组中,则输出"Not exist!"
输入
输入数据共2行
第一行10个整数,按从小到大的顺序输入,中间以空格分隔。
第二行1个整数
输出
折半查找所得该数所在数组中的元素下标,单独占一行。
若该数不存在,则输出一行信息 “Not exist!”

样例输入
1 2 3 4 5 6 7 8 9 10
3
样例输出
2
提示:
折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如 果x<a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x>a[n/2],则我们只要在数组a的右半部继续搜索x。

#include <stdio.h>
int main()
{
    
    
    int i,key,a[10],n,low,high,mid;
    low=0;
    high=9;
    for(i=0;i<10;i++)
        scanf("%d",&a[i]);    //输入有序数列到数组a中
    scanf("%d",&key);    //输入要^找的关键字
    while(low<high)    //査找范围不为0时执行循环体语句
    {
    
    
        mid=(low+high)/2;    //求中间位置
        if(key<a[mid])    //key小于中间值时
            high=mid-1;    //确定左子表范围
        else if(key>a[mid])    //key 大于中间值时
            low=mid+1;    //确定右子表范围
        else if(key==a[mid])    //当key等于中间值时,证明查找成功
        {
    
    
            printf("%d\n",mid);    //输出所査找元素在数组中的位置
            break;
        }
    }
    if(low>=high)    //判断是否查找失敗
        printf("Not exist!\n");    //査找失敗输出no found
    return 0;
}

1196: 习题6-10 字符统计

题目描述
有一篇文章,共3行文字,每行不到80个字符。要求分别统计每行中字母、数字、空格以及其他字符的个数。
输入
从键盘上输入3行字符,每行不到80个字符。
输出
输出信息占3行
每行输出4个整数,分别表示该行字符中字母、数字、空格以及其他字符的个数,数字之间以空格分隔。

样例输入 Copy
I am a student!
I’m 18 years old.
One Two Three 1 2 3!@#
样例输出 Copy
11 0 3 1
10 2 3 2
11 3 5 3

判断每一个字符串,统计结果,最后输出

#include<stdio.h>
#include<string.h>
int main()
{
    
    
    char a[80],b[80],c[80];
    int l1,l2,l3,i;
    int letter1=0,count1=0,null1=0,x1=0;
    int letter2=0,count2=0,null2=0,x2=0;
    int letter3=0,count3=0,null3=0,x3=0;
    gets(a);
    gets(b);
    gets(c);
    l1=strlen(a);
    l2=strlen(b);
    l3=strlen(c);
    for(i=0;i<l1;i++)
    {
    
    
        if('a'<=a[i]&&'z'>=a[i]||'A'<=a[i]&&'Z'>=a[i])
            letter1++;
        else if(a[i]==' ')
            null1++;
        else if(a[i]>='0'&&a[i]<='9')
            count1++;
        else x1++;
 
    }
    for(i=0;i<l2;i++)
    {
    
    
        if('a'<=b[i]&&'z'>=b[i]||'A'<=b[i]&&'Z'>=b[i])
            letter2++;
        else if(b[i]==' ')
            null2++;
        else if(b[i]>='0'&&b[i]<='9')
            count2++;
        else x2++;
    }
    for(i=0;i<l3;i++)
    {
    
    
        if('a'<=c[i]&&'z'>=c[i]||'A'<=c[i]&&'Z'>=c[i])
            letter3++;
        else if(c[i]==' ')
            null3++;
        else if(c[i]>='0'&&c[i]<='9')
            count3++;
        else x3++;
    }
    printf("%d %d %d %d\n",letter1,count1,null1,x1);
    printf("%d %d %d %d\n",letter2,count2,null2,x2);
    printf("%d %d %d %d\n",letter3,count3,null3,x3);
    return 0;
}

1197: 习题6-12 解密

题目描述
有一行电文,已按如下规律译成密码:
A–>Z a–>z
B–>Y b–>y
C–>X c–>x
… …
即第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求根据密码译回原文,并输出。
输入
输入一行密文
输出
解密后的原文,单独占一行。

样例输入 Copy
ZYX123zyx
样例输出 Copy
ABC123abc

对照ASCLL表判断,在他们的值上面做加减,实现转换

#include<stdio.h>///第i个字母变成第(26-i+1)个字母
#include<string.h>
int main()
{
    
    
    char a[80];
    int len,i;
    gets(a);
    len=strlen(a);
    for(i=0;i<len;i++)
    {
    
    
        if(64<a[i]&&91>=a[i]||96<a[i]&&123>a[i])
        {
    
    
            if(a[i]<91&&64<a[i])
            {
    
    
                a[i]=26-(a[i]-64)+1+64;
            }
            else if(96<a[i]&&123>a[i])
            {
    
    
                a[i]=26-(a[i]-96)+1+96;
            }
        }
    }
    puts(a);
    return 0;
}

1198: 习题6-13 字符串比较

题目描述
比较两个字符串s1和s2的大小,如果s1>s2,则输出一个正数;若s1=s2,则输出0;若s1<s2,则输出一个负数。
要求:不用strcpy函数;两个字符串用gets函数读入。
例如:“A"与"C"相比,由于"A”<“C”,应输出负数,同时由于"A"与"C"的ASCII码差值为2,因此应输出"-2"。
同理:"And"和"Aid"比较,根据第2个字符比较的结果,“n"比"i"大5,因此应该输出"5”
输入
输入2行字符串
输出
一个整数,表示这两个字符串 比较的差值,单独占一行。

样例输入 Copy
And
Aid
样例输出 Copy
5

#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
    
    
    char s1[80]={
    
    0},s2[80]={
    
    0},x=0;
    int len1,len2,i;
    gets(s1);
    gets(s2);
    len1=strlen(s1);
    len2=strlen(s2);
    if(len1==len2)
    {
    
    
        for(i=0;i<len2;i++)
        {
    
    
            x+=(s1[i]-s2[i]);
        }
    }
    if(len1<len2)
    {
    
    
        for(i=len1;i<len2;i++)
            x=x-s2[i];
    }
    if(len1>len2)
    {
    
    
        for(i=len2;i<len1;i++)
            x=x+s1[i];
    }
    printf("%d\n",x);
    return 0;
}

1199: 例题6-1 逆序输出数组元素

题目描述
从键盘上输入10个整数,存储在一个长度为10的整型数组中,要求将输入的10个数逆序输出。
如输入为:0,1,2,3,4,5,6,7,8,9 输出为9,8,7,6,5,4,3,2,1,0
输入
10个整数,以空格分隔
输出
将输入的10个整数逆序输出,每个数占一行。

样例输入 Copy
0 1 2 3 4 5 6 7 8 9
样例输出 Copy
9
8
7
6
5
4
3
2
1
0

#include<stdio.h>
#include<string.h>
int main()
{
    
    
    int a[10],i,j;
    for(i=0;i<10;i++)
    {
    
    
        scanf("%d",&a[i]);
    }
    for(j=9;j>=0;j--)
    {
    
    
       printf("%d\n",a[j]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43337254/article/details/109804764
今日推荐