2025.12.26代码分析

1.1题目

1.2代码

复制代码
#include<stdio.h>

int main()
{
    int HH,MM,X;
    scanf("%d:%d %d",&HH,&MM,&X);
    int i=1;
   while(X>0){
       if(X/10==0){
           MM=MM+X;
           X=0;
       }
       else{
        MM=MM+10;
       X=X-10;
           }
       if(MM>=60){
           HH++;
           MM=MM-60;
       }
       if(HH>=24){
           HH=HH-24;
       }
       printf("%d %02d:%02d\n",i,HH,MM);
       i++;
   }
    return 0;
}

1.3解题思路

本题是很简单的与时间相关的输入输出。

1.首先确定现在的时间和任务总时长,根据这三个变量来计算,注意以分钟来计算,每次加取10分钟,直到剩余不足十分钟。输出语句里面还要带上序号,那就定义一个序号变量,每次循环加1就好。

2.循环开始,循环条件是任务时长还大于0,那么看每次分钟要加多少,这个由X决定,因为每次是10分钟的加,如果X小于10那就需加X本身,所以还要判断每次分钟是加多少(10/X),我这里是分类讨论,其实还可以用一个变量代表每次加什么(a=(10>=X)?10:X),然后计算要表达的小时和分钟,因为分钟可能大于60,小时可能大于24,这就需要计算。

3.注意输出的格式,先序号,然后空格,之后小时和分钟,不过小时和分钟都是需要两位数,不足两位数用0补,每次输出都需要换行。

综上所有代码完成之后,检查程序是否能够运行。

1.4总结

本题是简单的时钟问题,主要是注意分钟那里的加法运算和输出语句的格式。

2.1题目

2.2代码

复制代码
#include<stdio.h>
#include<string.h>
int main()
{
    char a[30];
    scanf("%s",a);
    int len=strlen(a);
    for(int i=0;i<len;i++){
      if(s[i]='0')a[i]='1';
        else if(a[i]='1')a[i]='0';
    }
    int sum=0;
    for(int i=0;i<len;i++){
        sum=sum*2;
        if(a[i]=='1')sum++;
    }
    printf("%d",sum);
}

2.3解题思路

本题是二进制转化为十进制的计算,有多种方法。

1.根据题目,我们先输入一串数字字符串,然后题目说计算机的原因,这个字符串原本的'1'是'0',原本的'0'是'1',那么我们先要将字符串转换一下,将'0','1'转变一下,得到新的字符串。

2.这里将二进制转化成十进制用的是从左往右累乘法,这是一种比较高效的方法,从最高位开始累乘,然后还有一种传统幂次法。

累乘法:

复制代码
#include<stdio.h>
#include<string.h>
int main()
{
    char a[10];
    scanf("%s",a);
    int len=strlen(a);
    int sum=0;
    for(int i=0;i<len;i++){
        sum=sum*2;
        if(a[i]=='1')sum++;
    }
    printf("%d",sum);
    return 0;
}

幂次法:

复制代码
#include<stdio.h>
#include<string.h>
int main()
{
    char a[10];
    scanf("%s",a);
    int len=strlen(a);
    int sum=0;
    int power=1;
    for(int i=len-1;i>=0;i--){
        if(a[i]=='1')sum+=power;
        power*=2;
    }
    printf("%d",sum);
    return 0;
}

可以选择不用的方法去计算。

综上所有代码完成之后,检查程序是否能够运行。

2.4总结

本题是考察二进制的运算,可以多学点方法。

3.1题目

3.2代码

复制代码
#include<stdio.h>

int main()
{
    int t;
    scanf("%d",&t);
    int a[t];
    for(int i=0;i<t;i++){
        scanf("%d",&a[i]);
    }
    long long d[21];
    d[0]=1;
    d[1]=0;
    for(int i=2;i<21;i++){
         d[i]=(i-1)*(d[i-1]+d[i-2]);
    }
    for(int i=0;i<t;i++){
        printf("%lld\n",d[a[i]+1]);
    }
    return 0;
}

3.3解题思路

本题是需要我们算出笔友之间的寄信方式。

1.首先确定测试组数,然后根据这个组数定下数组,输入每组的数值。

2.根据题目对笔友的范围,小璐最多有19个笔友,但是算寄信方式小璐自己也在内,所以加上小璐,一共20个笔友,那么依次计算。先考虑特殊情况,一个人都没有只有1种方式,只有1个人没有方式寄信。然后从2开始,计算到最大笔友数,这个计算是有公式的,也可以去了解公式的推导。然后确定笔友可能数的寄信方式数之后来确定每组测试数据的方式,注意这里输入的值是小璐笔友的数量,但是我们计算的时候也要加上小璐,所以总值加1,计算出一个输出一个,不过需要换行。

综上所有代码完成之后,检查程序是否能够运行。

3.4总结

本题是运用公式来计算,需要注意总人数。

相关推荐
Xの哲學1 天前
Linux 软中断深度剖析: 从设计思想到实战调试
linux·网络·算法·架构·边缘计算
暴风游侠1 天前
如何进行科学的分类
笔记·算法·分类
leaves falling1 天前
冒泡排序(基础版+通用版)
数据结构·算法·排序算法
C雨后彩虹1 天前
无向图染色
java·数据结构·算法·华为·面试
坚持就完事了1 天前
扫描线算法
算法
鱼跃鹰飞1 天前
Leetcode尊享面试100题:252. 会议室
算法·leetcode·面试
程序员-King.1 天前
二分查找——算法总结与教学指南
数据结构·算法
Zevalin爱灰灰1 天前
现代控制理论——第三章 线性控制系统的能控性和能观性
线性代数·算法·现代控制
kklovecode1 天前
C语言之头文件,宏和条件编译
c语言·开发语言·算法
Xの哲學1 天前
Linux自旋锁深度解析: 从设计思想到实战应用
linux·服务器·网络·数据结构·算法