【考研复试上机】Ch1 暴力求解

发布时间:2024年01月22日

枚举

条件:数据量较小

模拟

图形排版

题解:

  • 找规律
  • 先构造,后输出。利用一个缓存数组来表示将要输出的字符阵列,然后在该数组上按照自己的需要完成排版,最后再输出图形。

日期问题

题解:

  • 预处理:再真正开始处理输入数据之前,预处理出所有月份的天数并保存。
  • 闰年:有29天,普通年分的2月只有28天。
  • 都可以转化为用该日期是今年的第几天?+第几天的日期是什么(两个逆运算)来解决问题。
//判断平年还是闰年
bool IsLeapYear(int year){
    return (year%4==0 && year%100!=0)||(year%400==0);
}
//平年闰年天数
int NumberOfYear(int year){
    if(IsLeapYear(year)){
        return 366;
    }
    else{
        return 365;
    }
}

判断日期是否合法

int days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};

bool check(int year,int month,int day)
{
    if(month==0||month>12) return false;
    if(day==0) return false;
    if(month!=2)
    {
        if(day>days[month]) return false;
    }
    else 
    {
        int flag = (year%100&&year%4==0||year%400==0); //能被4整除,不能被100整除,能被400整除
        if(day>28+flag) return false; //闰年的2月有29天
    }
    return true;
}

今年的第几天?

int main(){
	int year,month,day;
	while(cin>>year>>month>>day){
        int days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
		int flag = 0;
		int sumDays = 0;
		
		if(year%4==0&&year%100||year%400==0) flag = 1;
		if(flag == 1) days[2]+=1;
		
		for(int i=1;i<month;i++){
			sumDays+=days[i];
		}
		sumDays+=day;
		cout<<sumDays<<endl;
	}
	return 0;
}

进制转换

P进制数x,转换为10进制数y

int y = 0, product = 1;
while(x){
    y+=(x%10)*product;
    x/=10;
    product*=p;
}

10进制数y,转换为Q进制数z

int z[40], num = 0;
do{
    z[num++] = y%Q;
    y/=Q;
}while(y); //z数组从高位z[num-1]到低位z[0]即为Q进制z
文章来源:https://blog.csdn.net/weixin_42932602/article/details/135744599
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。