题目练习
蓝桥杯练习——十进制转换十六进制
问题
【问题描述】
十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。
给出一个非负整数,将它表示成十六进制的形式。
【输入格式】
输入包含一个非负整数a,表示要转换的数。0<=a<=2147483647
【输出格式】
输出这个整数的16进制表示
【样例输入】
30
【样例输出】
1E
思路
先把十进制转换成二进制,再把二进制转化成十六进制
详细:对于十进制数,先变成二进制的01字串,进栈;不要忘了补上0使得个数是4的倍数。然后4个一组出栈,组成一个十六进制数,最后把大于9的部分转换成相应的字母
代码
import java.util.Scanner;
import java.util.Stack;
//十进制转十六进制
public class Main {
public static char outof10(int n) {
char x;
switch (n) {
case 10: {
x='A';break;
}
case 11: {
x='B';break;
}
case 12: {
x='C';break;
}
case 13: {
x='D';break;
}
case 14: {
x='E';break;
}
default: {
x='F';break;
}
}
return x;
}
public static void change(int iT) {
Stack<Integer> stack=new Stack<>();
char []chSixt=new char[100];
int i,len=0,j,x,sum=0,l=0;
while(iT!=0) { //十进制转二进制
x=iT%2;
stack.push(x);
len++; //len是所有进栈的01的长度
iT/=2;
}
if(len%4!=0) { //补0,使得个数正好是4的倍数
int a=(len%4);
for(j=0;j<4-a;j++) {
stack.push(0);
l++;
}
len+=l;
}
int count=len/4; //一共转化成len/4位的16进制数
//System.out.print(len/4);
for(i=0;i<count;i++) {
int base=8;
sum=0;
for(j=0;j<4;j++) {
x=stack.pop();
sum+=x*base;
base/=2;
}
if(sum>=10) {
chSixt[i]=outof10(sum);
}
else {
chSixt[i]=(char) (sum+'0');
}
}
for (char c : chSixt) { //输出16进制数
System.out.print(c);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
int iTen=scanner.nextInt();
if(iTen!=0) {
change(iTen);
}
else {
System.out.print(0);
}
}
}
视频学习
蓝桥杯练习——概率模拟
思路
一个事件模拟很多次,看出现指定事件的次数
例题
30人的班级,生日出现重复的概率多大?
【思考】在0-365随机产生数字,看数字间有没有碰撞
对于N次实验,每次实验new一个数组存放0-365之间随机产生数字的情况。然后对于班级中的这三十人,每次产生一个随机数,当发现有两次产生了重合,就计数一次,同时直接进入下层循环;如果没有就标记
代码
public class RandomNum {
public static void main(String[] args) {
// TODO Auto-generated method stub
//Random random=new Random(1);
final int N=1000*100;
int i,j,n=0,k=0;
for(i=0;i<N;i++) {
int []x=new int[365];
for(j=0;j<30;j++) {
//随机产生一个数k
k=(int)(Math.random()*365);
if(x[k]==1) {
n++;
break;
}
else {
x[k]=1;
}
}
}
double d=(double)n/N;
System.out.println(d);
}
}
补充
【Math.random用法】
math.random()函数:取[0,1)之间的随机数
math.random()*100;
表示[0,100)之间的随机数