有趣的C语言——我的C语言之路

记录一下关于C语言竞赛重刷的例题,有些真的很有意思,如果你觉得特别简单,那说明你很牛,小弟我甘拜下风!! 勿喷 勿喷,仅记录学习历程(有些特别基础的就不弄了,弄一些我觉得处理方法很特别的,如果你有更简单、更特别的方法,还请不吝赐教吗?)

例1

  第一行 13

  第二行 1113

  第三行 3113

  第四行 132113

  第五行 1113122113

规律:第一行的数字任意,第二行的数字是对第一行的数字读出来的,比如第二行,是对一行的描述,意思是,1个1,1个3,所以是1113,第三行,意思是:3个1,1个3,所以是3113。

要求:第一行输入一个任意数,不超过100位;

第二行输入一个不大于20的数,表示你要连续多少次。

示例: 5   

            7

输出   13211321322115

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main(int argc, char *argv[])
{
  // 请在此输入您的代码
  char a[20][10001];
    int n,i,j,k,x,sum;
    gets(a[0]);
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        x=0;
        j=0;
        while(j<strlen(a[i]))
        {
            sum=1;
            for(k=j+1;k<strlen(a[i]);k++)
            {
                if(a[i][k]==a[i][j])    sum++;
                else    break;
            }
            a[i+1][x++]=sum+48;
            a[i+1][x++]=a[i][j];
            j+=sum;
        }
    }
    for(i=0;i<strlen(a[n]);i++)
    {
        printf("%c",a[n][i]);
    }
    return 0;
}

例2

构造螺旋方阵,输入螺旋方阵的n行m列,在随机输入两个数,显示螺旋方阵对应的数值。(学艺不精啊!困扰我好久)

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int n, m, r, c;
  scanf("%d %d", &n, &m);
  scanf("%d %d", &r, &c);

  int a[1000][1000];
  int count = 0;
  int num = 1;
  int i = 0;
  int j = 0;
  int circle=0;
  while(count<m*n)
  {
    while(j<m-circle)
    {
      if(i==0&&j==0)
      {
        a[i][j]=num;
        j++;
        num++;
        count++;
      }
      else
      {
        a[i][j++]=num;
        num++;
        count++;
      }
    }
    j--;
    i++;
    while(i<n-circle)
    {
      a[i++][j]=num;
      num++;
      count++;
    }
    i--;
    j--;
    while(j>=circle)
    {
      a[i][j--]=num;
      num++;
      count++;
    }
    j++;
    i--;
    while(i>circle)
    {
      a[i--][j]=num;
      num++;
      count++;
    }
    i++;
    j++;
    circle++;
  }
  printf("%d",a[r-1][c-1]);
  return 0;
}

例3

系统自动匹配对手时,只会将积分差恰好是K的两名用户匹配在一起。如果两人的积分小于或大于K,系统都不会将他们匹配,现在共有N名用户,以及他们的积分分别是A1、A2、A3、、、AN。求有多少名用户在线寻找对手,但是系统却一场对局都匹配不起来(任意两名用户积分差都不等于K)?(这儿也是,搞半天没搞出来)

#include <stdio.h>
#include <stdlib.h>
# define N 100010
int cnt[N];
int main(int argc, char* argv[])
{
    int n, K, Max = 0;
    scanf("%d%d", &n,&K);
    for (int i = 0; i < n; ++i)
    {
        int a;
        scanf("%d", &a);
        cnt[a]++;//表示a积分的人数
        Max = (Max > a) ? Max : a;//找出最高的积分
    }
    int math = 0;//math表示可以互选匹配的组数,不理解的话可以用k=0的情况,然后把题目的信息带入理解
    for (int i = 0; i + K <= Max; ++i)//k不等于0的情况
    {
        while (K && cnt[i] && cnt[i + K])//i的积分和i+k的积分之差就等于k
        {
            math++;//有一组能匹配就++,直到其中一个积分的人数为0,然后进行下一组匹配
            cnt[i]--;
            cnt[i + K]--;
        }
    }
    for (int i = 0; i <= Max; ++i)
    {
        while (!K && cnt[i] >= 2)
        {
            math += cnt[i] - 1;
            cnt[i] = 1;
        }
    }
    printf("%d", (n - math));

    return 0;
}

例4

给定一组分数,去掉与其余的分数平均值相差最远的那个分数(即”最离群“的分数)

#include <stdio.h>
#include <stdlib.h>
double score(double x[], int n)
{
    int i,j;
    double dif = -1;
    double bad;
    for(i=0; i<n; i++)
    {
        double sum = 0;
        for(j=0; j<n; j++)
        {
            if(j!=i) sum += x[j];     //计算去掉当前值后的总分
        }
        double t = x[i] - sum / (n-1);   //当前值减去其余分数的平均值
        if(t<0) t = -t;        //若计算的值比平均值小,则将其转换为正数
        if(t>dif)              /*将第一个值赋给dif,并判断依次去掉其余值时,与其他值的平均分差值进行比较*/
        {
            dif = t;
            bad = x[i];
            printf("%d, %f\n", i, x[i]);
        }
    }

    return bad;
}
int main(int argc, char* argv[])
{
    double x[] = {40,20,30,10,60};
    printf("%f\n", score(x,5));

    return 0;
}

例5

卖苹果,父亲把2520个苹果分别分给6个儿子,每个儿子手里分到的苹果数都不相同,父亲说,老大,把你的苹果分1/8给老二。老二连同原来的苹果分1/7给老三,老三连同原来的苹果分1/6给老四,老四连同原来的苹果分1/5给老五,老五连同原来的苹果分1/4给老六,老六再连同原来的苹果分1/3给老大。这样六个儿子手中的苹果数就相同了。求原来六个儿子手中的苹果数。(最想吐槽的就是这个,脑子没长出来,头发掉了不少)

#include "stdio.h"
void main()
{
	int x[7], y[7], s, i;
	s = 2520 / 6; 										/*求出平均每个人要分多少个苹果*/
	for (i = 2; i <= 6; i++)
		/*求从老二到老六得到哥哥分来的苹果却未分给弟弟时的苹果数*/
		y[i] = s * (9 - i) / (8 - i);
	y[1] = x[1] = (s - y[6] / 3) * 8 / 7;
	/*老大得到老六分来的苹果却未分给弟弟时的苹果数*/
	for (i = 2; i <= 6; i++)
		x[i] = y[i] - y[i - 1] / (10 - i);				/*求原来每人得到的苹果数*/
	for (i = 1; i <= 6; i++)
		printf("x[%d]=%d\n", i, x[i]);					/*将最终结果输出*/
}

例6

Excel 单元格的地址表示很有趣,它使用字母来表示列号比匕如,

A 表示第 1列,

B 表示第 2 列

Z 表示第 26 列

AA 表示第 27 列

AB 表示第 28 列

BA 表示第 53 列,

当然 Excel 的最大列号是有限度的,所以转换起来不难,

如果我们想把这种表示法一般化,可以把很大的数字转换为很长的字母序列呢?

本题目即是要求对输入的数字,输出其对应的 Excel 地址表示方式。

输入描述

输入一个整数 n,其范围[1,2147483647]。

输出描述

输出 n 对应的 Excel 地址表示方式。(这个也是个刺头儿)

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  long long int n;
    scanf("%lld",&n);
    char a[100];
    int i=0;
    while(n>0){
        int p=n%26;
        if(p==0){
            a[i++]='Z';
            n=n/26-1;
        }else{
            a[i++]='A'+p-1;
            n=n/26;
        }
    }
    for(int j=i-1;j>=0;j--){
        printf("%c",a[j]);
    }
  return 0;
}

例7

小蓝有n瓶汽水,他每喝完一瓶汽水就把瓶盖保存起来,k(k>1)个瓶盖可以换一瓶新的汽水,那么小蓝最后最多能喝多少瓶汽水?(这个不难,就是当时没想出来)

#include <stdio.h>
int func(int n,int k)
{
if (n < k)
{
    return n;
}
else
{
    return n-n%k  + func(n % k + n / k, k);   //递归思想
}
}
int main()
{
    int n,k;
   scanf("%d %d\n",&n,&k);
   int sum;
  sum=func(n,k);
   printf("%d",sum);
    return 0;
}

例8
给出班里某门课程的成绩单,请你按成绩从高到低对成绩单排序输出,如果有相同分数则名字字典序小的在前。
输入格式
第一行为n(0<n<20),表示班里的学生数目;
接下来的n行,每行为每个学生的名字和他的成绩,中间用单个空格隔开。名字只包含字母且长度不超过20,成绩为一个不大于100的非负整数。
输出
把成绩单按分数从高到低的顺序进行排序并输出,每行包含名字和分数两项,之间有一个空格。(第一次用结构体)

输入
4
Kitty 80
Hanmeimei 90
Joey 92
Tim 28
输出
Joey 92
Hanmeimei 90
Kitty 80
Tim 28

#include<stdio.h>
struct node
{  //定义结构体保存姓名和成绩
    int exam;
    char name[20];
}stu[20],temp;
int main()
{  
    int n, j, i;
    scanf("%d\n", &n);
    for (i = 0;i <= n - 1;i++) //循环保存所有人
        scanf("%s %d", &stu[i].name, &stu[i].exam);
    for (i = 0;i <= n - 1;i++)
        for (j = i + 1;j <= n - 1;j++)
            if (stu[i].exam < stu[j].exam)
            { //成绩降序排序
                temp = stu[i];
                stu[i] = stu[j];
                stu[j] = temp;
            }
            else if((stu[i].exam == stu[j].exam) && (stu[i].name > stu[j].name))
            { //姓名升序排序
                temp = stu[i];
                stu[i] = stu[j];
                stu[j] = temp;
            }
    for (i = 0;i <= n - 1;i++) //打印结果
        printf("%s %d\n", stu[i].name, stu[i].exam);
    return 0;
}

与C语言相见恨晚,妄图成为C大佬的菜鸟
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

珞(●'◡'●)雨了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值