每日训练题解

T1046 判断闰年:https://nanti.jisuanke.com/t/T1046

//思路:闰年的判断分三个点,一个是400,一个是100,一个是4,
如果一个数可以被400整除那么就是闰年,
如果一个数是100的倍数但是不是400的倍数,比如1900,那么不是闰年,
如果一个数不是100的倍数但是可以被4整除那么是闰年,比如2016,
如果一个数不能被4整除,那么不是闰年,比如2021

#include<stdio.h>
int main(){
	int n;
	scanf("%d",&n);
	if(n%400 == 0) printf("Y\n");
	else if(n%100 == 0) printf("N\n");
	else if(n%4 == 0) printf("Y\n");
	else printf("N\n");
	return 0;
}

2021.9.16
T1079 开关灯:https://nanti.jisuanke.com/t/T1079

//思路:统计每盏灯被开关的次数,如果是奇数,那么最后该灯的状态是亮的,否则

#include<stdio.h>
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	int light[5010] = {0};//刚开始每盏灯被开关的次数为0 
	for(int i=1;i<=m;i++){//第i个人
		for(int j=i;j<=n;j+=i){//可以操作的灯的编号 
			light[j]++;//第j盏灯被开关的次数的数量+1 
		}
	}
	int flag = 0;//用来标准化输出 
	for(int i=1;i<=n;i++){
		if(light[i]%2==1){//编号是i的灯是亮的 
			if(flag == 0){//第一个开着的灯的编号 
				printf("%d",i);
				flag = 1;
			}
			else printf(",%d",i);//非第一个开着的灯的编号 
		}
	}
	printf("\n");
	return 0;
}

2021.9.17

T1066 斐波那契数列:https://nanti.jisuanke.com/t/T1066

//思路:找到数列的规律,第i个数等于第i-2个数加第i-1个数的和 :fib[i] = fib[i-2] + fib[i-1] 

#include<stdio.h>
int main(){
	int fib[50];//定义一个数组来存放第几个斐波那契数列的值 
	int n;
	
	fib[1] = 1;fib[2] = 1;//斐波那契数列的初始化,把第一个数和第二个数初始化为 1 
	scanf("%d",&n);
	for(int i=3;i<=n;i++){
		fib[i] = fib[i-2] + fib[i-1];//第i个数等于第i-2个数加第i-1个数的和 
	}
	printf("%d",fib[n]);//输出第n个数 
	return 0;
	
} 

T1036 收集瓶盖赢大奖:https://nanti.jisuanke.com/t/T1036

//思路:分别对幸运和鼓励两个数的值与10和20做一下比较就好

#include<stdio.h>
int main(){
	int a,b;
	scanf("%d%d",&a,&b);
	if(a>=10 || b>=20) printf("1\n");//条件满足其中一个即可
	else printf("0\n");
	return 0;
}

T1058 奇数求和: https://nanti.jisuanke.com/t/T1058

//思路:遍历n到m,如果是奇数则答案加上这个数

#include<stdio.h>
int main(){
	int n,m;
	int ans = 0;
	scanf("%d%d",&n,&m);
	for(int i=n;i<=m;i++){//遍历n到m
		if(i%2==1) ans += i; //判断是否是奇数
	}
	printf("%d\n",ans);
	return 0;
}

T1072 药房管理:https://nanti.jisuanke.com/t/T1072

#include<stdio.h>
int main(){
	int sum,n;
	int shu[1010];//数组最多有 1000
	scanf("%d%d",&sum,&n);
	for(int i=0;i<n;i++){
		scanf("%d",&shu[i]);
	}
	int cnt = 0;//已取药品人数 
	for(int i=0;i<n;i++){ //遍历n个数 
		if(sum - shu[i] >= 0){ //如果可以取到药 
			sum -= shu[i]; //药品剩余减少该病人所取药的数量 
			cnt++; //已取病人人数+1 
		}
	}
	printf("%d\n",n - cnt);
	return 0;
}

T1319 质数判定一:https://nanti.jisuanke.com/t/T1319

#include<stdio.h>
#include<math.h> 
int main(){
	int n;
	scanf("%d",&n);
	int flag = 0;//判断是否为质数
	if(n==1) flag = 1;
	else{
		for(int i=2;i<=sqrt(n);i++){
			if(n%i==0){ //可以被整除,如果有因数,则这个数不是质数
				flag = 1;
				break;
			}
		}	
	}
	
	if(flag == 1) printf("No\n");
	else printf("Yes\n");
	return 0;
}

T1090 第n小的质数:https://nanti.jisuanke.com/t/T1090

//思路:从2开始遍历,判断是否是质数,统计质数个数直到第n个质数,输出

#include<stdio.h>
#include<math.h>

int main(){
	int n;
	scanf("%d",&n);
	int ans = 2;
	int cnt = 0;//统计质数的个数 
	while(cnt<n){
		int flag = 0;
		for(int i=2;i<=sqrt(ans);i++){//判断是否是质数 
			if(ans%i == 0){
				flag = 1;
				break;
			}
		}
		if(flag == 0) cnt++;//如果是质数,质数的个数+1 
		ans++;
	}
	ans--;//最后一步+1,要减去 
	printf("%d",ans);
	return 0;
}

T1095 有趣的跳跃:https://nanti.jisuanke.com/t/T1095

//n个数有n-1个差,如果要保证差值的绝对值排序之后是1~n-1,则说明差值既要在1~n-1之间,同时不能重复出现

#include<stdio.h>

int main(){
	int shu[3010];
	int n;
	scanf("%d",&n);
	int flag[3010] = {0};
	for(int i=0;i<n;i++){
		scanf("%d",&shu[i]);
	}
	int sign = 1;
	for(int i=1;i<n;i++){
		int x = shu[i] - shu[i-1];
		if(x<0) x = -x;//对差值取绝对值,如果差值是负数,x = -x 
		if(x>=n){//如果差值的绝对值大于n,则不符合在1 ~ n-1,退出 
			sign = 0;//非跳跃数列 
			break;
		}
		if(flag[x] == 0) flag[x] = 1;//对已经出现过的差值做标记 
		else{//该差值之前出现过
			sign = 0;
			break;
		}
	}
	

	if(sign == 1) printf("Jolly");
	else printf("Not jolly");
	return 0;
} 

T1358 判断直角三角形:https://nanti.jisuanke.com/t/T1358

//思路:先对三条边进行排序,如果最小的边是0或者最小的两条边的平方和不等于最长的那条边的平方,那么无法构成直角三角形

#include<stdio.h>

int main(){
	int san[3];
	scanf("%d%d%d",&san[0],&san[1],&san[2]);
	
	for(int i=0;i<2;i++){//对三条边进行排序 
		for(int j=i+1;j<3;j++){
			if(san[i]>san[j]){
				int t = san[i];
				san[i] = san[j];
				san[j] = t;
			}
		}
	}
	san[0] *= san[0];//令各个边等于其平方,方便判断 
	san[1] *= san[1];
	san[2] *= san[2];
	//如果有边为0或者a^2 + b^2 != c^2 输出"no" ,否则输出"yes"
	//排序之后只需看最小的那条边是否为0即可 
	if(san[0] == 0 ||san[0] + san[1] != san[2]) printf("no\n");
	else printf("yes\n");
	return 0;
	
}

T1829 二进制转化为十进制 :https://nanti.jisuanke.com/t/T1829

//思路:ans = ∑第 i 位的数 * 第 i 位的权值,二进制各个位的权值:2^0,2^1,2^2 ……

#include<stdio.h>

int main(){
	int n;
	scanf("%d",&n);
	int b[35];
	for(int i=1;i<=n;i++){
		scanf("%1d",&b[i]);
	}
	int ans = 0;
	int quan = 1;//代表当前位的权值
	 
	for(int i=n;i>0;i--){//从最低位开始一点点往前累加 
		ans += b[i]*quan;//ans加上该位的值成该位的权值 
		quan *= 2;//权值*2 
	}
	printf("%d",ans);
	return 0;
} 

T1152 成绩排序:https://nanti.jisuanke.com/t/T1152

//C语言

#include<stdio.h>
#include<string.h>

//定义一个结构体,里面有两个属性,一个是姓名,一个是成绩 
struct Student{
	char name[30];
	int score;
}stu[30];

//自定义一个比较函数,比较两个字符串的字典序的大小
//a的字典序大返回1,否则返回0 
int judge(struct Student a,struct Student b){//a的name 大于 b的name 返回 1,否则返回0 
	int len_a = strlen(a.name);
	int len_b = strlen(b.name);
	int i = 0;
	while(i<len_a && i<len_b){
		if(a.name[i] < b.name[i]){//a的字典序小 
			return 0; 
		}
		else if(a.name[i] > b.name[i]){//b的字典序小
			return 1; 
		}
		else i++;
	}
	if(len_a <= len_b) return 0;
	else return 1;
}

int main(){
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%s%d",stu[i].name,&stu[i].score);
	}
	
	//先按照成绩进行排序 
	for(int i=0;i<n-1;i++){
		for(int j=i+1;j<n;j++){
			if(stu[i].score < stu[j].score){
				struct Student t = stu[i];
				stu[i] = stu[j];
				stu[j] = t;
			}
		}
	}
	 
	//再对成绩相同的同学对姓名姓名排序 
	for(int i=0;i<n-1;i++){
		for(int j=i+1;j<n;j++){
			//如果第i个学生的成绩和第j个同学相同,则比较第i个学生的姓名和第j个同学的姓名 
			if(stu[i].score == stu[j].score && judge(stu[i],stu[j])){
				struct Student t = stu[i];
				stu[i] = stu[j];
				stu[j] = t;
			}
			else if(stu[i].score != stu[j].score) break;
		}
	}
	for(int i=0;i<n;i++){
		printf("%s %d\n",stu[i].name,stu[i].score);
	}
	return 0;
}

//C++

#include<iostream>
#include<string>
#include<algorithm>

using namespace std;

const int maxn = 1010;
struct infor{
	string name;
	int score;
}stu[maxn];

bool cmp(infor a,infor b){
	if(a.score == b.score) return a.name < b.name;
	else return a.score > b.score;
}

int main(){
	int n;
	cin >> n;
	for(int i=0;i<n;i++){
		cin >> stu[i].name >> stu[i].score;
	}
	
	sort(stu,stu+n,cmp);
	
	for(int i=0;i<n;i++){
		cout << stu[i].name << " " << stu[i].score << endl;
	}
	
	return 0;
}

T1083求出e的值:https://nanti.jisuanke.com/t/T1083

//思路:最开始答案是1,用一个值记录分母,然后ans += 1 / 分母,最后注意保留十位小数即可

#include<stdio.h>
int main(){
    double ans = 1;//最终结果
    int n;
    double jie = 1;//分母
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        jie *= i;//分母不断变化,在之前的基础上乘当前是第几数个即可
        ans += 1.0 / jie;
    }
    printf("%.10lf\n",ans);//注意输出
    return 0;
}

T1109字符替换:https://nanti.jisuanke.com/t/T1109

方法一:
/*思路:找准每个字符对应的位置,我们用gets()取完之后,
用 len 表示整个串的长度,
那么目标串的长度是 len-4,需要替换的字符是第 len-3个,替换的结果是第 len-1个,
我们开一个数组来记录最终结果,遇到需要替换的字符就替换掉,没有遇到就保持原样,
最后注意如果开一个数组来保存最终结果的话最后要加一个'\0'。
*/

#include<stdio.h>
#include<string.h>

int main(){
    char s[40];
    char ans[40];
    char a,b;
    gets(s);
    int len = strlen(s);
    a = s[len-3];//需要被替换的字符
    b = s[len-1];//需要被替换成的字符
    for(int i=0;i<len-3;i++){
        if(s[i] == a) ans[i] = b;//如果遇到了需要被替换掉的字符就替换
        else ans[i] = s[i];//否则就保持原样
    }
    ans[len-3] = '\0';//最后不要忘记加字符串的结束标志
    printf("%s",ans);
    return 0;
}

方法二:
/*不用 gets() 读入一整行字符串,直接用%s把目标串读取完。
然后接下来再读两个字符,注意中间要用空格隔开,
如果目标串出现了需要转换的字符那么我们就进行转换,否则就保持不变
*/

#include<stdio.h>
#include<string.h>

int main(){
    char s[40];
    char a,b;
    scanf("%s %c %c",s,&a,&b);
    int len = strlen(s);
    for(int i=0;i<len;i++){
        if(s[i] == a) s[i] = b;
    }
    printf("%s",s);
    return 0;
}

T1376 青蛙爬井:https://nanti.jisuanke.com/t/T1376

/*思路:我们先计算一天时间青蛙可以净往上的距离( 即val = up - down ),
因为最后一天我们可以往爬上 up 的距离,所以我们只需要计算青蛙爬 high - up 的高度需要多少天即可,
我们直接用  t1 = ( high - up)/ val,
如果不能整除,因为最终结果是一个整数,我们就要在 t1 的基础上再加一天;
如果可以整除,那么我们的 t1 就正好是青蛙爬(high - up)所需要的天数。
最后不要忘记还要再加一天爬=用来爬最后的 up 的距离。
注意:不能简单地认为每天上升的高度等于白天向上爬的距离减去夜间下滑的距离,因为若白天能爬出井口,则不必等到晚上。
*/


#include<stdio.h>

int main(){
    int down,up,high;
    scanf("%d%d%d",&high,&up,&down);
    int ans = 0;
    int val = up - down;
    int t1 = (high - up) / val;

    if(val * t1 < high - up) t1++; //不能被整除,在此基础上再加一天

    t1++;//最后一天

    printf("%d",t1);
    return 0;
}

T1085与7无关的数:https://nanti.jisuanke.com/t/T1085

#include<stdio.h>

int judge(int x){// 判断是否与7有关,如果有关返回0,否则返回1
    if(x%7 == 0) return 0;//是不是7的倍数
    while(x){//判断每一位,是否含有7
        if(x%10 == 7) return 0;
        x /= 10;
    }
    return 1;
}
int main(){
    int n;
    scanf("%d",&n);
    long long ans = 0;
    for(int i=1;i<=n;i++){
        if(judge(i))//如果与7无关
            ans += i*i;//加上平方和
    }
    printf("%lld\n",ans);
    return 0;
}

T1080求分数序列和:https://nanti.jisuanke.com/t/T1080

#include<stdio.h>

int main(){
    int n;
    scanf("%d",&n);
    double p,q;
    double ans = 0;
    p = 1;
    q = 2;
    for(int i=1;i<=n;i++){
        ans += q / p;
        int t = q;//临时保存一下q的值
        q += p;//q = q + p;
        p = t;//p = q;t等于q,用t代替
    }
    printf("%.4lf\n",ans);
    return 0;
}

T1153整数奇偶排序:https://nanti.jisuanke.com/t/T1153

#include<stdio.h>

int main(){
    int odd[10],even[10];//分别保存奇数和偶数的数组
    int ji = 0,ou = 0;//分别统计奇数和偶数的个数
    for(int i=0;i<10;i++){
        int x;
        scanf("%d",&x);
        if(x % 2 == 0){//偶数
            even[ou] = x;//放到偶数的数组里
            ou++;//偶数的个数+1
        }
        else{
            odd[ji] = x;
            ji++;
        }
    }
    
    //对奇数进行从大到小排序
    for(int i=0;i<ji-1;i++){
        for(int j=i+1;j<ji;j++){
            if(odd[i]<odd[j]){
                int t = odd[i];
                odd[i] = odd[j];
                odd[j] = t;
            }
        }
    }
    //对偶数进行从小到大的排序
    for(int i=0;i<ou-1;i++){
        for(int j=i+1;j<ou;j++){
            if(even[i]>even[j]){
                int t = even[i];
                even[i] = even[j];
                even[j] = t;
            }
        }
    }
    for(int i=0;i<ji;i++) printf("%d ",odd[i]);//先输出奇数
    for(int i=0;i<ou;i++) printf("%d ",even[i]);//后输出偶数
    return 0;
}

T1132计算矩阵边缘元素之和:https://nanti.jisuanke.com/t/T1132

/* 遍历数组中的每个元素,判断是不是边缘元素即可
边缘元素有几个特点:若矩阵为m*n,如果一个数是边缘元素,那么他的横坐标是1或者m,或者他的纵坐标为1或者n,即如果元素坐标为(i,j),如果(i = 1 或者 j = 1 或者 i = m 或者 j = n),那么这个元素是边缘元素。
*/

#include<stdio.h>

int main(){
    int mat[110][110];
    int n,m;
    scanf("%d%d",&m,&n);
    for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++){
            scanf("%d",&mat[i][j]);
        }
    }
    int ans = 0;
    for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++){
            if(i==1 || j==1 || i == m || j == n) //判断是不是边缘元素
ans += mat[i][j];//如果是,则加上这个元素的值
        }
    }
    printf("%d",ans);
    return 0;
}

T1723约瑟夫问题:https://nanti.jisuanke.com/t/T1723

/*模拟过程,设置一个状态数组来记录这个人是否出圈,如果未出圈标记为0,出圈标记为1;
然后用一个变量来记录出圈的人数,如果出圈人数和总人数相等代表所有人都出圈了,游戏结束;
用取模来模拟不断循环的过程,假设所有人的序号为0~n-1这n个数,序号为n-1的同学数完了之后下一个人应该是第0号同学,即(n-1 + 1)%n = 0;
如果第 i 个人是最后一个人,即序号为 n - 1,则他的下一个为(n-1 + 1)%n = 0;
如果第 i 个人不是最后一个人,即序号小于 n - 1,则他的下一个为 (i + 1)%n = i + 1。
所以通过取模就把这两种情况归纳为一个操作,即(i+1)%n;
但是我们是从1开始数的,所以我们最后在输出的时候把这个人的序号+1输出即可,即序号为 i 的同学实际上是第 i+1 个
*/

#include<stdio.h>
int main(){
    int state[110] = {0};
    int n,m;
    int sum = 0;//记录出圈的人数
    scanf("%d%d",&n,&m);
    int i = 0;
    while(sum<n){//如果出圈人数小于总人数,游戏继续
        int cnt = 0;//开始数m个数进行报数
        while(1){
            if(state[i] == 0){//如果这个人没有出圈,则他报数
                cnt++;
            }
            if(cnt == m) break;//报数达到m,退出
            i = (i+1)%n;//没有达到m,则到下一个人
        }
        printf("%d ",i+1);//最后一个报数的人是第 i 号,则进行+1输出
        state[i] = 1;//第 i 号出圈
        sum ++ ;//出圈人数+1
    }
    return 0;
}

T3094前缀极差:https://nanti.jisuanke.com/t/T3094

/* 用两个数组记录前 i 个数的最大值和最小值,Max[i] 和 Min[i]。
如果 i = 1,那么最大值和最小值都是第一个数
否则的话,   Max[i] = max(Max[i-1],第 i 个数) //前 i-1个数的最大值和当前数取一下最大值
Min[i] = min(Min[i-1],第 i 个数)。//前 i-1 个数的最小值和当前数取一下最小值

*/

#include<stdio.h>

int max(int a,int b){//返回a和b较大的那一个
    if(a>b) return a;
    else return b;
}

int min(int a,int b){//返回a和b较小的那一个
    if(a<b) return a;
    else return b;
}

int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    int Max[100100],Min[100100];
    for(int i=1;i<=n;i++){
        int x;
        scanf("%d",&x);
        if(i == 1){
            Max[i] = x;//前一个数最大值是他本身
            Min[i] = x;//前一个数最小值是他本身
        }
        else{
            Max[i] = max(Max[i-1],x);//用来记录前i个数的最大值
            Min[i] = min(Min[i-1],x);//用来记录前i个数的最小值
        }
    }

    //for(int i=1;i<=n;i++) printf("%d %d\n",Max[i],Min[i]);

    for(int i=0;i<m;i++){
        int x;
        scanf("%d",&x);
        printf("%d ",Max[x] - Min[x]);//用前i个数的最大值减去前i个数的最小值
    }

    return 0;
}
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值