通师高专科技创新社团队训练赛(20211027)
A 逆序输出
题意
逆序输出。
思路
- 1.十个整数。
- 2.逆序输出,空格分开。
坑点
无。
代码
#include<stdio.h>
int main()
{
int num[10];//定义一个10的数组
for(int i=0;i<10;i++)//输入i行
{
scanf("%d",&num[i]);
}
for(int i=9;i>=0;i--) 从10-1开始依次进行循环,i-1
{
printf("%d ",num[i]);输出
}
return 0;
}
总结
for 的循环使用 难度简单。
B 求平均年龄
题意
求平均值。
思路
- 1.输出一行,该行包含一个浮点数。
- 2.保留到小数点后两位。
坑点
- 1.注意定义的类型。
- 2.小数点的输出的格式。
代码
#include<stdio.h>
int main()
{
double sum;//题目中结果为小数, 浮点型有double和float
int n; //定义整数n为输入的数的个数
scanf("%d",&n);//输入整数n
int num[105];//有 100组数
for(int i=0;i<n;i++) //循环起点为0,终点的数值小于整数n ,i+1
{
scanf("%d",&num[i]);//循环里输入num[i]
sum=sum+num[i];//总和就加num[i] sum+=num[i]
}
sum=sum/n;//循环结束, 最终的结果除输入数的个数,得到平均年龄
printf("%.2f",sum);//输出结果后面要加两位小数
return 0;
}
总结
for的循环使用 输出格式 难度简单。
C 奇数单增数列
题意
找出所有奇数并进行从小到大的排序。
思路
- 1.找出所有的奇数。
- 2.进行排序。
坑点
- 1注意输出格式。
代码
#include<stdio.h>
int num[505];//大气的开五个数 num包括505个数的位置
int ans[505];//好多奇数在ans505里的奇数
int main()
{
int n,cnt=0;//定义 n,奇数从0取
scanf("%d",&n);//输入n个数
for(int i=0;i<n;i++)//起点为0,终点到n-1,i每次加上1
{
scanf("%d",&num[i]);//循环里输入i为上述条件的数组
if(num[i]%2!=0)//如果num[i]对2取余不为0,就是奇数
{
ans[cnt]=num[i];//ans[cnt]里奇数就等于num[i]里的数
cnt++; //奇数+1
}
} //取奇数
for(int i=0;i<cnt;i++)// 起点为0,终点<取得的奇数,i+1
{
int temp; //设一个可以进行转换的值
for(int j=0;j<cnt-1;j++)//起点为j=0,cnt里的奇数两两比较需要cnt-1次(4个数比较需要比较3次),j+1
{
if(ans[j]>ans[j+1])//判断ans数组里的前一位数是否大于后一位数
{ temp=ans[j];//如果大于,把ans[j]的数赋值到temp中
ans[j]=ans[j+1];//如果大于,把ans[j]的后一位赋值给ans[j]
ans[j+1]=temp;//如果大于,把temp赋值给ans[j+1]
}
}
}//从小到大排序
for(int i=0;i<cnt;i++)// 在这个起点为0,终点<取得的奇数,i+1的循环中
{
printf("%d",ans[i]);// 输出的是ans里面的数
if(i!=cnt-1) //如果 ans里面的数不是奇数的最后一位
{
printf(",");//那么输出值后面要加逗号
}
}
return 0;
}
总结
冒泡排序,输出格式的注意 难度偏难。
D 最高的数
题意
求最大值。
思路
- 1.先定一个总数和一个有输入的值,和一个最大值的变量。
- 2.在让输入的值与最大值进行比较。
坑点
无。
代码
#include<stdio.h>
int main()
{
int n,a;//n是总数,a是输入的数
int maxn=0;//maxn初始值为零 ,maxn表示最大的数
scanf("%d",&n);
for(int i=1;i<n;i++)//输入是从1开始,n结束,每组循环后i+1 数的排序
{
scanf("%d",&a);//输入a组数据
if(maxn<=a)//判断最大值是否小于等于a 如果最大值小于等于数据里输入的数 (a)
//a{1,2,3,4,5} maxn=6 maxn大于a 达咩
// a{1,2,3,4,5} maxn=5 maxn小于等于a √
{
maxn=a;//那么这组数据的最大值就是a
}
}
printf("%d\n",maxn);//输出最大值
return 0;
}
总结
for循环 if判断 难度中等。
E 数列问题
题意
输入一个数,然后输出对应的值。
思路
- 1.输入一个数。
- 2.输出打印值。
坑点
- 1.注意num的值要加long long 因为会爆int。
代码
#include<stdio.h>
long long int num[65];//num数组里的数会超过10的9次方,所以用long long int
int main()
{
int n;//定义n个数
scanf("%d",&n);//输入n个数
num[0]=3;//下标为0的数第一个是 3
num[1]=4;//下标为1的数第一个是 4
num[2]=5;//下标为2的数第一个是 5 []是下标
for(int i=3;i<=60;i++)//起点为从下标第三位开始,i到60结束 ,i+1
{
num[i]=num[i-1]+num[i-2]+num[i-3];// 每个数都等于前三个数的和
}
printf("%lld",num[n-1]);//第一项是从下标为0开始,第n个就是从下标为n-1开始
//3 4 5 12 ...n
//0 1 2 3.. .n-1
return 0;
}
总结
下标的运用 ,long long int的运用,难度简单 。
G 整数的个数
题意
输入一个组数组,如果能被1整除记一下,如果能被5记一下,然后能被10整除记一下。
思路
- 1,第一行包含一个正整数 k。
- 2.,第二行包含 k 个正整数,每两个正整数用一个空格分开。
坑点
- 无。
代码
#include<stdio.h>
int main()
{
int k,a1=0,a5=0,a10=0;//定义k个正整数 ,令数组有1的个数,5的个数,10的个数赋初值为0
scanf("%d/n",&k);//输入k个数
int num[105];//大气的多开五个数,正整数的个数在105之内
for(int i=0;i<k;i++)//循环起点为0,终点小于k个正整数,i+1
{
scanf("%d",&num[i]);//循环里输入i为上述条件的数组
}
for(int i=0;i<k;i++)//循环起点为0,终点小于k个正整数,i+1
{
if(num[i]==1)// 如果数组里面的为1
{
a1++;//存储数组里面值为1的数的个数+1
}
if(num[i]==5)// 如果数组里面的为5
{
a5++;//存储数组里面值为5的数的个数+1
}
if(num[i]==10)//如果数组里面的为10
{
a10++;//存储数组里面值为10的数的个数+1
}
}
printf("%d\n%d\n%d\n",a1,a5,a10);//最终输出三行 第一行是数组里有1的数的个数;第二行是数组里有5的数的个数;第三行是数组里有10的数的个数
return 0;
}
总结
if的判断,循环排序 难度简单。
H 6048
题意
输入一个4位数然后输出这4个数的重新组成一个四位的最大数和一个最小数,算出两者间的差。
思路
- 1.输入一个四位数。
- 2.把四位数拆开为4个单独的字符。
- 3.然后重新排序,然后判断。
坑点
- 1.数的排序。
代码
#include<stdio.h>
int num[10];
int main()
{
int n,maxn,minn;//定义n个整数
scanf("%d",&n);//输入n的值
// 4(千位) 3(百位) 2(十位) 1(个位)
//num 0 1 2 3 【下标】
num[3]=n%10;//总数4321取余10得出1 num[3]表示个位数
num[2]=n/10%10;//总数4321除10变成432 再取余10得出2就是432/10=43......2 num[2]表示十位数
num[1]=n/100%10; //总数4321除100变成43; 43/10=4....3就是取余3 num[1]表示百位数
num[0]=n/1000;//总数4321除1000变成4; num[0]表示千位数
//把数组从大到小排
for(int i=0;i<4;i++){ // 在这个起点为0,i小于4位数,i+1的循环中
for(int j=0;j<3;j++){// 起点为0,j循环3次,j+1
int temp; //设一个可以进行转换的值
if(num[j]<num[j+1]){ //如果j小于j+1(前一位数小于后一位数) 就要执行下面的交换
temp=num[j];//num[j]的数赋值到temp中
num[j]=num[j+1];//num[j+]赋值到num[j]中
num[j+1]=temp;//temp赋值到 num[j+]中
}
}
}
maxn=num[0]*1000+num[1]*100+num[2]*10+num[3];
// 4(千位) 3(百位) 2(十位) 1(个位)
//num 0 1 2 3 下标
//最大值这个数就是 4*1000+3*100+2*10+1=4000+300+20+1=4321
//最小值这个数就是 1*1000+2*100+3*10+4 =1000+200+30+4=1234
minn=num[3]*1000+num[2]*100+num[1]*10+num[0];
printf("%d",maxn-minn);//输出是最大值-最小值
return 0;
}
总结
冒泡排序,数的取余排序,难度困难。