记录一下关于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大佬的菜鸟