2021.2.28学习记录

题目练习

蓝桥杯练习——十六进制转换十进制

问题

【问题描述】

从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
 注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。

【样例输入】

FFFF

【样例输出】

65535

注意

先把十六进制转化成二进制,再把二进制转化成十六进制。

这道题思路不难,但是做的时候还是要格外小心仔细的,我错了n遍才全通过。。。

先将十六进制的每个数拆出来化成二进制,再把组合的一整个二进制数化成十进制。存放二进制数的结构,上一道十进制转十六进制我用的栈,然后这次想当然也用的栈,结果就离谱了,后来才发现用队列

这里要注意几个地方:1.小于7的数转化成二进制时不足四位,要把0补上,否则之后算十进制时会错位

2.有的测试数据很大,相关的变量例如十进制数最终结果sum和中间用来相乘的base要用long型

代码

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class SixttoTen {
	
	public static int outof10(char c) {
		int x;
		switch (c) {
		case 'A': {
			x=10;break;
		}
		case 'B': {
			x=11;break;
		}
		case 'C': {
			x=12;break;
		}
		case 'D': {
			x=13;break;
		}
		case 'E': {
			x=14;break;
		}
		default: {
			x=15;break;
		}
	}
		return x;
}
	
	public static void change(String str) {
		Queue<Integer> queue=new LinkedList<>();
		int i,j,len=0,in,t,l=0,in1,x;
		long sum=0,base=1;//l是专门用来记录每个数转化了多少位二进制数
		for(i=chSixt.length-1;i>=0;i--) {
			if(chSixt[i]>'9') {
				in=outof10(chSixt[i]);
			}
			else {
				in=chSixt[i]-'0';
			}
			//System.out.print(in+" ");
			in1=in;
			while(in1!=0) {
				t=in1%2;
				queue.offer(t);
				in1/=2;
				len++;
				l++;
			}
			if(in<=7) {
				for(j=1;j<=4-l;j++) {
					queue.offer(0);len++;
				}
			}
			l=0;
		}
		while(!queue.isEmpty()) {
			x=queue.poll();
			sum+=x*base;
			base=base*2;
		}
		System.out.println(sum);
		
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner=new Scanner(System.in);
		String sSisxt=scanner.next();
		change(sSisxt);
	}
}

视频学习

视频1
视频2

蓝桥杯练习——日期问题

【例】

从XXXX年XX月XX日到XXXX年XX月XX日之间共有几天?

思路

如果直接减的话太麻烦,且容易出错,一个简单的方法就是以一个时间点为原点,一般以公元元年为起点计算从这个时间点到所求时间过了多久,再把两者相减即可

代码

import java.util.Scanner;
/*
 * 要求:求两个日期的差值
 * 思路:先设定一个原点,量日期的差值等于大的日期到原点的差值减小的日期到原点的差值
 * 例:1915年2月24日到2020年11月6日
 * */
public class DateDif {
	
	public static boolean leepyear(int y) {    //判断闰年
		if(y%400==0||y%100!=0&&y%4==0) {
			return true;
		}
		else return false;
	}
	public static int day_cul(int y,int m,int d) {    //计算每个日期到原点的日子数
		int i,sum=0;
		for(i=0;i<y;i++) {
			sum+=365;
			if(leepyear(i)) {
				sum++;
			}
		}
		for(i=0;i<m;i++) {
			if(i==1||i==3||i==5||i==7||i==8||i==10||i==12) {
				sum+=31;
			}
			else if(i==4||i==6||i==9||i==11) {
				sum+=30;
			}
			else {
				sum+=28;
			}
		}
		sum+=d;
		return sum;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner=new Scanner(System.in);
		int year1,mon1,day1,year2,mon2,day2;
		year1=scanner.nextInt();
		mon1=scanner.nextInt();
		day1=scanner.nextInt();
		year2=scanner.nextInt();
		mon2=scanner.nextInt();
		day2=scanner.nextInt();
		int res=day_cul(year2, mon2, day2)-day_cul(year1, mon1, day1);
		System.out.println(res);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值