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