黄金队列,汉诺塔,奇怪的比赛,第一个数字,割圆,最大数,矩形的交集和并集,趣味算式(第三届蓝桥杯Java本科预赛试题)
来源:互联网 发布:淘宝网包包女包 编辑:程序博客网 时间:2024/05/06 12:34
/*黄金队列求鲁卡斯队列
*
黄金分割数0.618与美学有重要的关系。舞台上报幕员所站的位置大约就是舞台宽度的0.618处,墙上的画像一般也挂在房间高度的0.618处,甚至股票的波动据说也能找到0.618的影子....
黄金分割数是个无理数,也就是无法表示为两个整数的比值。0.618只是它的近似值,其真值可以通过对5开方减去1再除以2来获得,我们取它的一个较精确的近似值:0.618034
有趣的是,一些简单的数列中也会包含这个无理数,这很令数学家震惊!
1 3 4 7 11 18 29 47 .... 称为“鲁卡斯队列”。它后面的每一个项都是前边两项的和。
如果观察前后两项的比值,即:1/3,3/4,4/7,7/11,11/18 ... 会发现它越来越接近于黄金分割数!
你的任务就是计算出从哪一项开始,这个比值四舍五入后已经达到了与0.618034一致的精度。
请写出该比值。格式是:分子/分母。比如:29/47
答案写在“解答.txt”中,不要写在这里!
3571/5778*/
public class HJDuiLie {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
double a[]=new double[100];
a[0]=1;
a[1]=3;
for(int i =2;i<100;i++)
{
a[i]=a[i-1]+a[i-2];
if(Math.abs(a[i-1]/a[i]-0.618034)<1e-7)
{
System.out.println(a[i-1]+"/"+a[i]);
break;
}
}
}
}
/*汉诺塔问题
*
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。
大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上(可以借助第三根柱子做缓冲)。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
如图【1.jpg】
是现代“山寨”版的该玩具。64个圆盘太多了,所以减为7个,金刚石和黄金都以木头代替了......但道理是相同的。
据说完成大梵天的命令需要太多的移动次数,以至被认为完成之时就是世界末日!
你的任务是精确计算出到底需要移动多少次。
很明显,如果只有2个圆盘,需要移动3次。
圆盘数为3,则需要移动7次。
那么64个呢?
* */
import java.math.BigInteger;
import java.util.Scanner;
public class HanNuoTa {
private static int step=0;
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
char a='a';
char b='b';
char c='c';
f(n,a,b,c);
/*BigInteger[] s=new BigInteger[64];
s[1]=new BigInteger("1");
for(int i=2;i<=63;i++)
{
s[i]=(s[i-1].multiply(new BigInteger("2"))).add(new BigInteger("1"));
}
System.out.println(s[63]);*/
System.out.println(step);
}
public static void f(int n,char a,char b,char c)
{
if(n==1)
{
step++;
}
else
{
f(n-1,a,c,b);
step++;
f(n-1,b,a,c);
}
}
}
/*奇怪的比赛
* 某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:
每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。
每位选手都有一个起步的分数为10分。
某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?
如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011 就是可能的情况。
你的任务是算出所有可能情况。每个答案占一行。
*/
public class StrangeScore {
private static int n=10;//题的总数
private static int[] temp=new int[11];//记录题是否答对,0代表答错,1代表答对
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
f(10,1);
}
public static void f(int sum,int cur)
{
if(sum==100&&cur==11)//执行成功
{
for(int i=1;i<=10;i++)
{
System.out.print(temp[i]);
}
System.out.println();
return;
}
if(cur>=11||sum<0)//错误情况
{
return;
}
temp[cur]=1;
sum*=2;
f(sum,cur+1);
sum/=2;
temp[cur]=0;
sum-=cur;
f(sum,cur+1);
sum+=cur;
}
}
/*第一个数字
以下的静态方法实现了:把串s中第一个出现的数字的值返回。
如果找不到数字,返回-1
例如:
s = "abc24us43" 则返回2
s = "82445adb5" 则返回8
s = "ab" 则返回-1
* */
public class GetFirstNum {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String s="abc24us43";
System.out.println(getFirstNum(s));
}
public static int getFirstNum(String s)
{
if(s==null || s.length()==0) return -1;
char c = s.charAt(0);
if(c>='0' && c<='9') return c-'0';
return getFirstNum(s.substring(1, s.length()));
}
}
割圆:
/* 南北朝时,我国数学家祖冲之首先把圆周率值计算到小数点后六位,比欧洲早了1100年!他采用的是称为“割圆法”的算法,实际上已经蕴含着现代微积分的思想。
如图【1.jpg】所示,圆的内接正六边形周长与圆的周长近似。多边形的边越多,接近的越好!我们从正六边形开始割圆吧。
如图【2.jpg】所示,从圆心做弦的垂线,可把6边形分割为12边形。该12边形的边长a'的计算方法很容易利用勾股定理给出。之后,再分割为正24边形,....如此循环会越来越接近圆周。
之所以从正六边开始,是因为此时边长与半径相等,便于计算。取半径值为1,开始割圆吧!
以下代码描述了割圆过程。
程序先输出了标准圆周率值,紧接着输出了不断分割过程中多边形边数和所对应的圆周率逼近值。
* */
public class GeYuan {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("标准 " + Math.PI);
double a = 1;
int n = 6;
for(int i=0; i<10; i++)
{
double b = Math.sqrt(1-(a/2)*(a/2));
a = Math.sqrt((1-b)*(1-b) + (a/2)*(a/2));
n = n*2;
System.out.println(n + " " + a*n/2);
}
}
}
package lilu.shuxue;
/*最大数
[12,127,85,66,27,34,15,344,156,344,29,47,....]
这是某设备测量到的工程数据。
因工程要求,需要找出最大的5个值。
一般的想法是对它排序,输出前5个。但当数据较多时,这样做很浪费时间。因为对输出数据以外
的数据进行排序并非工程要求,即便是要输出的5个数字,也并不要求按大小顺序,只要找到5个
就可以。
以下的代码采用了另外的思路。考虑如果手里已经抓着5个最大数,再来一个数据怎么办呢?
让它和手里的数据比,如果比哪个大,就抢占它的座位,让那个被挤出来的再自己找位子,...
* */
import java.awt.List;
import java.util.Arrays;
import java.util.Vector;
public class FiveBigNum {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Integer> lst = new Vector<Integer>();
lst.addAll(Arrays.asList(12,127,85,66,27,34,15,344,156,344,29,47));
System.out.println(max5(lst));
}
public static List<Integer> max5(List<Integer> lst)
{
if(lst.size()<=5) return lst;
int a =lst.remove(lst.size()-1); // 填空
List<Integer> b = max5(lst);
for(int i=0; i<b.size(); i++)
{
int t = b.get(i);
if(a>t)
{
b.set(i,a); // 填空
a = t;
}
}
return b;
}
}
/*矩形的交集和并集
*
在编写图形界面软件的时候,经常会遇到处理两个矩形的关系。
如图【1.jpg】所示,矩形的交集指的是:两个矩形重叠区的矩形,当然也可能不存在
(参看【2.jpg】)。两个矩形的并集指的是:能包含这两个矩形的最小矩形,它一定是存在的。
本题目的要求就是:由用户输入两个矩形的坐标,程序输出它们的交集和并集矩形。
矩形坐标的输入格式是输入两个对角点坐标,注意,不保证是哪个对角,也不保证顺序(你可以体会一下,在桌面上拖动鼠标拉矩形,4个方向都可以的)。
输入数据格式:
x1,y1,x2,y2
x1,y1,x2,y2
数据共两行,每行表示一个矩形。每行是两个点的坐标。x坐标在左,y坐标在右。坐标系统是:屏幕左上角为(0,0),x坐标水平向右增大;y坐标垂直向下增大。
要求程序输出格式:
x1,y1,长度,高度
x1,y1,长度,高度
也是两行数据,分别表示交集和并集。如果交集不存在,则输出“不存在”
前边两项是左上角的坐标。后边是矩形的长度和高度。
例如,用户输入:
100,220,300,100
150,150,300,300
则程序输出:
150,150,150,70
100,100,200,200
例如,用户输入:
10,10,20,20
30,30,40,40
则程序输出:
不存在
10,10,30,30
* */
import java.util.Scanner;
public class JuZhenJB {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
//得到输入\
int x1,y1,x2,y2,x3,y3,x4,y4;
String s=sc.nextLine();
s=s.trim()+",";
String[] st=new String[4];
int j=0,k=0;
for(int i=0;i<s.length();i++)
{
char c=s.charAt(i);
if(c==',')
{
st[k++]=s.substring(j,i);
j=i+1;
}
}
x1=Integer.parseInt(st[0]);
y1=Integer.parseInt(st[1]);
x2=Integer.parseInt(st[2]);
y2=Integer.parseInt(st[3]);
// System.out.println(x1+" "+y1+" "+x2+" "+y2);
s=sc.nextLine();
s=s.trim()+",";
j=0;
k=0;
for(int i=0;i<s.length();i++)
{
char c=s.charAt(i);
if(c==',')
{
st[k++]=s.substring(j,i);
j=i+1;
}
}
x3=Integer.parseInt(st[0]);
y3=Integer.parseInt(st[1]);
x4=Integer.parseInt(st[2]);
y4=Integer.parseInt(st[3]);
//System.out.println(x3+" "+y3+" "+x4+" "+y4);
/*int x1=sc.nextInt();
int y1=sc.nextInt();
int x2=sc.nextInt();
int y2=sc.nextInt();
int x3=sc.nextInt();
int y3=sc.nextInt();
int x4=sc.nextInt();
int y4=sc.nextInt();*/
if(x1>x2)//一直保证x1 小于x2;
{
int temp=x1;
x1=x2;
x2=temp;
}
if(y1>y2)//保证y1小于y2
{
int temp=y1;
y1=y2;
y2=temp;
}
if(x3>x4)//一直保证x3 小于x4;
{
int temp=x3;
x3=x4;
x4=temp;
}
if(y3>y4)//保证y3小于4
{
int temp=y3;
y3=y4;
y4=temp;
}
//开始求解
int jstartx=-1,jstarty=-1,jendx=-1,jendy=-1;//交集的起始点和结束点
int bstartx=-1,bstarty=-1,bendx=-1,bendy=-1;//并集的起始点和结束点
//求得交集的起始点和丙级的起始点的x坐标
if(x3>=x1&&x3<=x2)
{
jstartx=x3;
bstartx=x1;
if(x4<=x2)
{
jendx=x4;
bendx=x2;
}
else
{
jendx=x2;
bendx=x4;
}
}
else if(x3<x1)
{
if(x4<x1)
{
//System.out.println("不存在!");
bstartx=x3;
bendx=x2;
}
else if(x4>=x1&&x4<=x2)
{
jstartx=x1;
jendx=x4;
bstartx=x3;
bendx=x2;
}
else if(x4>x2)
{
jstartx=x1;
jendx=x2;
bstartx=x3;
bendx=x4;
}
}
else if(x3>x2)
{
//System.out.println("不存在!");
bstartx=x1;
bendx=x4;
}
//求得交集的起始点和丙级的起始点的y坐标
if(y3>=y1&&y3<=y2)
{
jstarty=x3;
bstarty=x1;
if(y4<=y2)
{
jendy=y4;
bendy=y2;
}
else
{
jendy=y2;
bendy=y4;
}
}
else if(y3<y1)
{
if(y4<y1)
{
//System.out.println("不存在!");
bstarty=y3;
bendy=y2;
}
else if(y4>=y1&&y4<=y2)
{
jstarty=y1;
jendy=y4;
bstarty=y3;
bendy=y2;
}
else if(y4>y2)
{
jstarty=y1;
jendy=y2;
bstarty=y3;
bendy=y4;
}
}
else if(y3>y2)
{
//System.out.println("不存在!");
bstarty=y1;
bendy=y4;
}
//输出
int jc=jendx-jstartx;
int jg=jendy-jstarty;
int bc=bendx-bstarty;
int bg=bendy-bstarty;
if(jstartx==-1)
{
System.out.println("不存在");
}
else
{
System.out.println(jstartx+","+jstarty+","+jc+","+jg);
}
System.out.println(bstartx+","+bstarty+","+bc+","+bg);
}
}
/*趣味算式
匪警请拨110,即使手机欠费也可拨通!
为了保障社会秩序,保护人民群众生命财产安全,警察叔叔需要与罪犯斗智斗勇,因而需要经常性
地进行体力训练和智力训练!
某批警察叔叔正在进行智力训练:
1 2 3 4 5 6 7 8 9 = 110;
请看上边的算式,为了使等式成立,需要在数字间填入加号或者减号(可以不填,但不能填入其它
符号)。之间没有填入符号的数字组合成一个数,例如:12+34+56+7-8+9 就是一种合格的填
法;123+4+5+67-89 是另一个可能的答案。
请你利用计算机的优势,帮助警察叔叔快速找到所有答案。
每个答案占一行。形如:
12+34+56+7-8+9
123+4+5+67-89
......
已知的两个答案可以输出,但不计分。
各个答案的前后顺序不重要。
* */
public class QuWeiSuanShi {
private static int[] a=new int[10];//保存分割的位置
private static char[] c=new char[10];//保存数字之间的运算符号
private static int[] sum=new int [10];//保存分割后的数
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i=2;i<9;i++)
{
fenGe(i,0,1);
}
}
//n数字之间放隔板的个数,cur当前放到第几个隔板,start该次隔板可以开始的位置
public static void fenGe(int n,int cur,int start)
{
if(cur==n)
{
//数分割完毕
a[cur]=9;
/*for(int i=0;i<=n;i++)
{
System.out.print(a[i]+" ");
}
System.out.println();*/
panDuan(n);
return;
}
if(start>=9)//没有地方可以放隔板了
{
return;
}
for(int i=start;i<9;i++)
{
a[cur]=i;
fenGe(n,cur+1,i+1);
}
}
//得到分割后的数 n代表范放了几个隔板
public static void panDuan(int n)
{
int j=1;
for(int i=0;i<=n;i++)
{
int sum1=0;
for(;j<=a[i];j++)
{
sum1=sum1*10+j;
}
sum[i]=sum1;
}
/*for(int i=0;i<=n;i++)
{
System.out.print(sum[i]+" ");
}
System.out.println();*/
int sum2=sum[0];
zuHe(n+1, sum2,1);
}
//n 几个数 sum 几个数通过加减的结果 cur当前进行到第几个数
public static void zuHe(int n,int sum2,int cur)
{
if(cur==n)
{
if(sum2==110)
{
//成功。输出结果
for(int i=0;i<n-1;i++)
{
System.out.print(sum[i]+""+c[i+1]);
}
System.out.println(sum[n-1]);
}
return;
}
sum2+=sum[cur];
c[cur]='+';
zuHe(n,sum2,cur+1);
sum2-=sum[cur];
sum2-=sum[cur];
c[cur]='-';
zuHe(n,sum2,cur+1);
sum2+=sum[cur];
}
}
- 黄金队列,汉诺塔,奇怪的比赛,第一个数字,割圆,最大数,矩形的交集和并集,趣味算式(第三届蓝桥杯Java本科预赛试题)
- 2012蓝桥杯预赛试题本科c++奇怪的比赛
- 第三届蓝桥杯预赛java趣味算式
- 趣味算式--第三届蓝桥杯预赛真题 java本科组 第9题
- 2013第四届蓝桥杯预赛试题本科c++马虎的算式
- 2014第五届蓝桥杯预赛试题本科c++奇怪的分式
- 第三届蓝桥杯预赛java组第一题黄金队列
- 2012_预赛_java_本科试题“奇怪的比赛”参考答案---田野上的稻草人
- 2012蓝桥杯Java本科组第八题——矩形的交集与并集
- 第三届蓝桥杯预赛第九题——趣味算式
- 2012年第三届蓝桥杯C/C++程序设计本科B组省赛 奇怪的比赛(结果填空)
- 2012年第三届蓝桥杯C/C++程序设计本科B组省赛题目 奇怪的比赛 结果填空
- 2012年第三届蓝桥杯C/C++程序设计本科B组省赛 奇怪的比赛(结果填空)
- 第三届蓝桥杯【省赛试题4】奇怪的比赛
- [JAVA][2013蓝桥杯预赛 JAVA本科B组][马虎的算式]
- 2012蓝桥杯C++本科 奇怪的比赛
- 密码发生器--第三届蓝桥杯预赛真题 c++本科组 第8题(我用java做的)
- 夺冠概率--第三届蓝桥杯预赛真题 c++本科组 第9题(我用java做的)
- jBPM5.4.0:使用MySql数据库
- 同一页面js获取DIV的高度并赋给另一个DIV或其他标签
- dojo/Memory模块隐含bug(dojo1.8.0)
- 龚海燕给创业者的六点建议
- 如何赚取CSDN积分(献给自己和大家有需要时,希望有帮助)
- 黄金队列,汉诺塔,奇怪的比赛,第一个数字,割圆,最大数,矩形的交集和并集,趣味算式(第三届蓝桥杯Java本科预赛试题)
- Java中的Enum的使用与分析
- trailing nulcols:difference between external table and sqlldr:create external table from controlfile
- Struts2的ResultType和Action处理链
- DP背包问题
- fopen的默认路径问题:no such file
- PHP <5.2ver 将数组转换成json格式的方法
- myeclipse中出现 org.hibernate.MappingException: Unknown entity: cn.itcast.hibernate.domain.User
- 细节管理 不是“芝麻大的事”!