SDUT OJ 2976

写在前面:
最近有小学弟问了,刚来的小学弟正在打基础的阶段
于是po出了老同学写的答案^^
希望小学弟们能在c/c++的世界打出一片天地,算法的大门时刻为你们打开oooooo

A

Problem Description
有一个长度为n的整数序列,其中最大值和最小值不会出现在序列的第一和最后一个位置。
请写一个程序,把序列中的最小值与第一个数交换,最大值与最后一个数交换。输出转换好的序列。
Input
输入包括两行。
第一行为正整数n(1≤n≤10)。
第二行为n个正整数组成的序列。
Output
输出转换好的序列。数据之间用空格隔开。

#include <stdio.h>
int main()
{
    int a[10], n, i, max, min, j, b;
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    max = a[0];
    min = a[0];
    for (i = 0; i < n; i++)
    {
        if (a[i] >= max)
        {
            max = a[i];
            j = i;
        }
        if (a[i] <= min)
        {
            min = a[i];
            b = i;
        }
    }
    a[j] = a[n - 1];
    a[n - 1] = max;
    a[b] = a [0];
    a[0] = min;
    int flag = 1;
    for(i = 0; i < n; i++)
    {
        if (flag)
        {
        printf("%d", a[i]);
        flag = 0;
        }
        else
        printf(" %d", a[i]);

    }
return 0;
}

B

Problem Description
输入一个不多于5位的正整数,要求:
(1)求出它是几位数;
(2)分别输出每一位数字;
(3)按逆序输出各位数字。
Input
输入一个不多于5位的正整数。
Output
输出数据有3行,第一行为正整数位数,第二行为各位数字,第三行为逆序的各位数字。

#include<stdio.h>
int main()
{   
int a[5] = {}, n, i, q, w;  
scanf("%d", &n);   
q = n;   
w = 1; 
   while(q >= 10) 
   {       
            w++;    
            q = q / 10;   
  }     
        printf("%d\n", w); 
   for(i = 0; n > 0; i++)  
  {       
       a[i] = n % 10;   
       n = n / 10;    }      
  for (i = w - 1; i >= 0; i--)      
  {           
        printf("%d", a[i]);     
        if (i) 
           printf(" ");           
   }      
    printf("\n");       
for (i = 0; i <= w - 1; i++)       
    {          
      if(i) printf(" ");    
            printf("%d", a[i]);          
     }     
       printf("\n");return 0;}

C

Problem Description
对于每次的输入,第一行一个整数N个整数第一个数是这些数字中小于他们平均数的数字的个数,第二个数为等于他们平均数的数字的个数,第三个数为大于他们平均数的数字的个数。

Input
N(1 <= N <= 10),代表数字的个数。
M(0 <= M <= 100)。

Output
输出包含三个数,第一个跟第二个数后面是空格,最后一个数后面是换行。第一个数是这些数字中小于他们平均数的数字的个数,第二个数为等于他们平均数的数字的个数,第三个数为大于他们平均数的数字的个数。

#include <stdio.h>
int main()
{   

int n, a[10] = {},s, ave, m, j, k ;   

while (~scanf("%d", &n)) 

   {      

        m = 0;    

        k = 0;   

        j = 0;  

       s = 0;     

   for (int i = 0; i < n; i++)      

  {        

    scanf("%d", &a[i]);       

     s += a[i];      

   }      

     ave = s / n;   

     for (int i = 0; i < n; i++)    

    {          

         if(a[i] < ave)         

         k++;          

         if(a[i] == ave)        

          m++;       

         if(a[i] > ave)         

          j++;       

}      

printf("%d %d %d\n", k, m, j);

    }

return 0;

}

D

Problem Description

小鑫和健健喜欢在课间的时候玩游戏,今天他手里有n张卡片,每张卡片有一个数字。于是他就想和健健比一比更幸运。
玩法是这样的:这n张卡片上的数字是没有规律的。他俩轮流取走最上面的一张卡片,最后谁取走卡片上的数字之和最大,谁就更幸运。(因为这个游戏是小鑫想出来的,总是小鑫拿第一张)
你能帮他们判断谁更幸运么?
Input
第一行为一个数字 n。100000>n>0
第二行为n个数,是n张卡片上的数字,第一个数为最上面的卡片上的数,依次向下。N个数是在整型范围内。
Output
如果小鑫更幸运输出“Greater than”,如果健健更幸运输出“Less than”,否则“Equal”。(输出均不含引号)

#include <stdio.h>
#define n 100000
int main()
{
    int a[n] = {}, t, s1, s2;
    s1 = 0;
    s2 = 0;
    scanf("%d", &t);
    for (int i = 0; i < t; i++)
    {
        scanf("%d", &a[i]);

    }
    for(int i = 0; i < t; i++)
    {
        if (i == 0 || i % 2 == 0)
        s1 =s1 + a[i];
        if (i % 2 != 0)
        s2 =s2 + a[i];
    }
    if (s1 > s2)
        printf("Greater than");
    else if (s1 < s2)
        printf("Less than");
    else
        printf("Equal");
return 0;
}

E

Problem Description

给定一个由 n 个整数组成的序列A1,A2,……, An 和两个整数L,R,你的任务是写一个程序来计算L,R 这段位置区间内所有数的总和。

Input

输入只有一组测试数据:

测试数据的第一行为一个整数 n (1< n < 10000);

第二行为 n 个 int 类型的整数;

第三行为两个整数 L,R(0 < L < R <= n)。

Output

输出区间[L,R]内所有数的和,数据保证和在 int 类型范围内。

#include <stdio.h>
#define n 10000
int main()
{
    int a[n] = {}, t, l, r, s;
    s = 0;
    scanf("%d", &t);
     for (int i = 0; i < t; i++)
    {
        scanf("%d", &a[i]);

    }
    scanf("%d %d", &l, &r);

    for(int i = l - 1; i < r; i++)
    {
       s += a[i];
    }
    printf("%d\n", s);
return 0;
}

F

Problem Description
从键盘输入一个长整数(不超过10位),从高位开始逐位分割并输出。
Input
正整数n,不含前导零。
Output
分割的整数序列,各整数之间用空格格开。
注意,最后一个数字后面没有空格!

#include <stdio.h>
#define h 10
int main()
{
    int a[h] = {}, q, n, w, flag;
    flag = 1;
    w = 1;
    scanf("%d", &n);
    q = n;
    while (q >= 10)
    {
        q = q / 10;
        w++;
    }
     for (int i = w - 1; i >= 0; i--)
    {
        a[i] = n % 10;
        n = n / 10;
    }
    for (int i = 0; i <= w - 1; i++)
    {
        if(flag)
        {
            printf("%d", a[i]);
            flag = 0;
        }
        else
            printf(" %d", a[i]);
    }
return 0;
}

G

Problem Description
输入10个整数存入一维数组,按逆序重新存放后再输出。
Input
输入包括一行。
10个以空格隔开的整数。
Output
逆序的10个整数,整数以空格隔开。

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

H

Problem Description
给你N(N<=100)个数,请你按照从小到大的顺序输出。

Input
输入数据第一行是一个正整数N,第二行有N个整数。

Output
输出一行,从小到大输出这N个数,中间用空格隔开。

#include <stdio.h>
#define h 100
int main()
{
    int i, j, t, a[h], n;
    scanf("%d", &n);
    for(i = 0; i <= n - 1; i++)
    {
        scanf("%d", &a[i]);

    }
    for(i = 0; i <= n - 2; i++)
    {
        for(j = i + 1; j <= n - 1; j++)
        {
            if (a[i] > a[j])
            {
                t = a[i];
                a[i] = a[j];
                a[j] = t;
            }
        }
    }
    for(i = 0; i <= n - 1; i++)
    {
        printf("%d ", a[i]);
    }
return 0;
}

I

Problem Description
有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数m,请将该数插入到序列中,并使新的序列仍然有序。
Input
输入数据包含多个测试实例,每组数据由两行组成,第一行是n和m,第二行是已经有序的n个数的数列。n和m同时为0表示输入数据的结束,本行不做处理。
Output
对于每个测试实例,输出插入新的元素后的数列。

#include <stdio.h>
#define h 101
int main()
{
    int i, j, a[h], n, m;
    while (~scanf("%d %d", &n, &m) && (n || m))
    {
        for(i = 0; i <= n - 1; i++)
    {
        scanf("%d", &a[i]);

    }
    for(i = 0; i <= n; i++)
    {
        if (m < a[i])
        {
            for (j = n - 1; j >= i; j--)
            {
                a[j + 1] = a[j];
            }
            a[i] = m;
            break;
        }

    }
    for(i = 0; i <= n; i++)
    {
        if (i == n)
            printf("%d", a[i]);
        else
        printf("%d ", a[i]);
    }
    printf("\n");
    }
return 0;
}

J

Problem Description
输入n个整数,输出由这些整数组成的n行矩阵。

Input
第一行输入一个正整数N(N<=20),表示后面要输入的整数个数。
下面依次输入N个整数。

Output
以输入的整数为基础,输出有规律的n行数据。

Example Input
5
3 6 2 5 8
Example Output
3 6 2 5 8
8 3 6 2 5
5 8 3 6 2
2 5 8 3 6
6 2 5 8 3

#include <stdio.h>
#define h 10
int main()
{
    int i, j, a[h], n, m;

    scanf("%d", &n);
    if(n>10) printf("%d", 1/0);
    for(i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    for(j = 1; j <= n; j++)
    {
        m = 1;
        for(i = 0; i < n; i++)
        {
            if(m)
            {
                printf("%d", a[i]);
                m = 0;
            }
            else
            printf(" %d", a[i]);
        }
        printf("\n");
        for(i = n - 1; i >= 0; i--)
        {
            a[i + 1] = a[i];
            if(i == 0)
                  a[0] = a[n];

        }

    }
return 0;
}

K

Problem Description
输入10个整数,将它们从小到大排序后输出,并给出现在每个元素在原来序列中的位置。
Input
输入数据有一行,包含10个整数,用空格分开。
Output
输出数据有两行,第一行为排序后的序列,第二行为排序后各个元素在原来序列中的位置。
Example Input
1 2 3 5 4 6 8 9 10 7
Example Output
1 2 3 4 5 6 7 8 9 10
1 2 3 5 4 6 10 7 8 9

#include <stdio.h>
#define h 100
int main()
{
    int i, j, a[h], n, b[h], t, flag = 1, p = 1;
    n = 10;
    for(i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
        b[i] = i + 1;
    }
    for(i = 0; i < n; i++)
    {
       for (j = 0; j < n - i - 1; j++)
       {
           if (a[j] < a[j + 1])
           {
               t = a[j];
               a[j] = a[j + 1];
               a[j + 1] = t;
               t = b[j];
               b[j] = b[j + 1];
               b[j + 1] = t;
           }
       }

    }
    for(i = n - 1; i >= 0; i--)
    {
        if(flag)
        {
            printf("%d", a[i]);
            flag = 0;
        }
        else
            printf(" %d", a[i]);
    }
    printf("\n");
   for(i = n - 1; i >= 0; i--)
    {
        if(p)
        {
            printf("%d", b[i]);
            p = 0;
        }
        else
            printf(" %d", b[i]);

    }
    printf("\n");
return 0;
}


L

Problem Description
给定n个正整数,根据各位数字之和从小到大进行排序。
Input
输入数据有多组,每组数据占一行,每行的第一个数正整数n,表示整数个数,后面接n个正整数。当n为0时,不作任何处理,输入结束。n<=10
Output
输出每组排序的结果。

#include <stdio.h>
#define h 10
int main()
{
    int i, j, t, a[h], n, s, b[h], q, f;

    while(~scanf("%d", &n) && n != 0)
    {
        for (i = 0; i < n; i++)
        {
            scanf("%d", &a[i]);
            s = 0;
            f = a[i];
               while (f >= 10)
            {

                 q = f % 10;
                f = f / 10;
                s += q;
            }
            s += f;
            b[i] = s;
        }
      for (i = 0; i < n - 1; i++)
        {
            for(j = 0; j <= n - i - 2; j++)
            {
                if(b[j] > b[j + 1])
                {
                    t = b[j];
                    b[j] = b[j + 1];
                    b[j + 1] = t;
                    t = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = t;
                }
            }
        }
        for(i = 0; i < n; i++)
        {
            if (i == n - 1)
                printf("%d", a[i]);
            else
                printf("%d ", a[i]);
        }
        printf("\n");
    }
return 0;
}

M

Problem Description
期末考试结束了,童鞋们的成绩也出来的了,可是为了排名次可忙坏了老师,因为学生太多了。这时,老师把这个任务交给了你,希望你能帮老师完成。作为IT人,你当然不能用笨笨的人工方法了,编程解决才是好办法。
共有三门课,语文、数学和英语,要求根据学生的各科成绩计算出其总成绩,并根据总成绩从高到低排序。

Input
第一行一个整数N(N<=100),代表学生的人数。
接下来的N行数据,每行有三个整数,C,M,E分别代表一个学生语文、数学和英语的成绩。
Output
一共N行,每行一个数,从大到小,分别代表各个学生的总成绩。

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



    return 0;
}

N

Problem Description
X最近爱上了区间查询问题,给出N(N <= 200)个数,然后进行M次询问,每次询问时,输入一个数X(1<= X <= N),输出N个数中第X大的数。
Input
多组输入。
每组首先输入一个整数N,代表有N个数,下面一行包含N个整数,用空格隔开。然后为一个整数M,代表有M次询问,下面的M行,每行一个整数X。
Output
输出N个数中第X大的数。

#include <stdio.h>
#define h 200
int main()
{
    int i, j, t, a[h], n, k, c;
    while(~scanf("%d", &n) && n != 0)
    {
        for (i = 0; i < n; i++)
        {
            scanf("%d", &a[i]);

        }
      for (i = 0; i < n - 1; i++)
        {
            for(j = 0; j <= n - i - 2; j++)
            {

                if(a[j] < a[j + 1])
                {
                    t = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = t;
                }
            }
        }
    scanf("%d", &k);
    for(i = 0; i < k; i++)
    {
        scanf("%d", &c);
            printf("%d\n", a[c - 1]);
    }
    }
return 0;
}

O

Problem Description
小鑫非常喜欢运动,有一次小鑫去参加110米栏的比赛,一共有10名比赛选手,小鑫是1号,由于跑的太专注,最后冲线的时候不知道自己是第几名,只知道每个人最后的成绩,聪明的你可不可以帮帮他?

Input
多组输入。
先输入一个10,
然后每组输入10个整数,代表10个选手的110米栏成绩m,代表1号到N号的N个选手的成绩m,m范围是(0 < m < 100)。

Output
输出只有一行,代表小鑫最后的名次是多少。
因为小鑫长得比较丑,所以如果成绩相同的情况下,小鑫都会排在前面。

#include <stdio.h>
#define h 100
int main()
{
    int i, j, a[h], n, b[h], t, tem;
    n = 10;
    while(scanf("%d", &i) != EOF)
    {
        for(i = 0; i < n; i++)
        {
            scanf("%d", &a[i]);
            b[i] = i + 1;
        }
        tem = a[0];
        for(i = 0; i < n; i++)
        {
           for (j = 0; j < n - i - 1; j++)
           {
               if (a[j] > a[j + 1])
               {
                   t = a[j];
                   a[j] = a[j + 1];
                   a[j + 1] = t;
                   /*t = b[j];
                   b[j] = b[j + 1];
                   b[j + 1] = t;*/
               }
           }
        }
        for(i = 0;i < n;i++)
        {
            if(tem == a[i])
            {
                break;
            }
        }


        printf("%d\n", b[i]);
    }
    return 0;
}

P

Problem Description
听说过冒泡排序么?很好玩很暴力的一种排序方式,但对于小数据也是很实用的哦。今天我们不希望你用它来排序,而是希望你能算出从小到大冒泡排序的过程中一共进行了多少次数据交换。

Input
输入数据的第一行为一个正整数 T ,表示有 T 组测试数据。
接下来T行,每行第一个整数N, 然后有N个整数,无序。0<N<100

Output
输出共 T 行。
每行一个整数,代表本行数据从小到大冒泡排序所进行的交换次数。

#include <stdio.h>
#define h 100
int main()
{
    int i, j, a[h], n1, n2, t;
    scanf("%d", &n1);
    while(n1--)
    {
        int count = 0;
        scanf("%d", &n2);
        for(i = 0; i < n2; i++)
        {
            scanf("%d", &a[i]);
        }
        for(i = 0; i < n2; i++)
        {
            for (j = 0; j < n2 - i - 1; j++)
            {
                if (a[j] > a[j + 1])
                {
                    t = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = t;
                    count++;
                }
            }
        }

        printf("%d\n", count);
    }
return 0;
}

Q

Problem Description
有n个整数,使其最后m个数变成最前面的m个数,其他各数顺序向后移m(m < n < 100)个位置。
Input
输入数据有2行,第一行的第一个数为n,后面是n个整数,第二行整数m。
Output
按先后顺序输出n个整数。

    #include <stdio.h>
    #define h 10000
    int main()
    {
      int n, a[h], i, m, t, flag = 1;
      scanf("%d", &n);
      for(i = 0; i < n; i++)
      {
          scanf("%d", &a[i]);
      }
      scanf("%d", &m);
    
      while(m--)
      {
         t = a[n - 1];
         for(i = n - 2; i >= 0; i--)
        {
            a[i + 1] = a[i];
        }
        a[0] = t;
      }
    for(i = 0; i < n; i++)
    {
         if(flag)
         {
             printf("%d", a[i]);
             flag = 0;
         }
         else
            printf(" %d", a[i]);
    }
    printf("\n");
    return 0;
    }

R

Problem Description
光阴似箭,日月如梭,大学的时间真是宝贵,要抓紧时间AC_。你知道今天是这一年第几天吗,掐指一算还是要算好久,呵呵还是让计算机来做吧。这里的问题就是让你来写一个程序,输入某年某月某日,判断这一天是这一年的第几天?
Input
输入数据有多组,第一行是数据的组数n,下面n行是n组数据,每组数据由3个正整数组成,分别为年、月、日,我们保证每组数据都是有效的日期。
Output
输出所输入的日期是这一年的第几天。

#include <stdio.h>
int main()
{
  int n, i, y, m, d, s;
  scanf("%d", &n);
  while(n--)
  {
      s = 0;
      scanf("%d %d %d", &y, &m, &d);
      if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
      {
          int b[]={0,31,29,31,30,31,30,31,31,30,31,30,31};
          for (i = 0; i < m; i++)
         {
            s = s + b[i];
         }
         s += d;
      }
      else
      {
        int a[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
        for (i = 0; i < m; i++)
       {
          s = s + a[i];
       }
       s += d;
      }
      printf("%d\n", s);

  }
return 0;
}

————————————————
版权声明:本文为CSDN博主「清寒飘叶」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/a_madara/article/details/53032904

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值