0
点赞
收藏
分享

微信扫一扫

打酱油路过,吉首大学第六届新星杯暨程序设计大赛-题解-Java


问题 A: 难题

时间限制: 1 Sec  内存限制: 128 MB
题目描述

C语言函数,数学函数,傻傻分不清楚~~

题目很简单,我们定义F(x)是满足x取余a乘b的积等于0(即:x%(a*b)==0)这样的a,b的组数。现在给你一个n,你需要求出 F(n)。

1=10   2=10*21

3=10*31  4=10*22  2*3

6=10*21*31 2*2*2

16=10*24 2*5

25=10*52 2*3

比如说当n=4时,a b分别可以是——1*1、1*2、1*4、2*1、2*2、4*1,共6种情况,所以F(4) = 6。

输入

多组输入(不会超过200组)
每组测试数据输入一个整数n (1 <= n <= 10^11)

输出

每组测试数据输出 Case x: y ,x 表示第x组测试数据,y表示F(n)的值,细节参考样例。

样例输入

1

2

3

4

样例输出

Case 1: 1

Case 2: 3

Case 3: 3

Case 4: 6

代码:(代码还存在问题,只能通过100*1000以内的数据)

import java.util.Scanner;

public class A {

	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		while(true){
			int n=sc.nextInt();
			System.out.println("Case "+n+": "+getCase(n));	
		}
	}

	private static int getCase(int n) {
		int conut=0;
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n ; j++) {
				if(n%(i*j)==0){
					conut++;
					System.out.println(i+"...."+j);
				}
			}
		}
		return conut;
	}
}


问题 B: 我是难题

时间限制: 1 Sec  内存限制: 128 MB

题目描述

“回文”是指正读反读都能读通的句子,它是古今中外都有的一种修辞方式和文字游戏,如“我为人人,人人为我”等。在数学中也有这样一类数字有这样的特征,成为回文数

   现在出题如下:

    对于10进制数87:

    STEP1:87+78  =165                 STEP2:165+561 =726

    STEP3:726+627 =1353               STEP4:1353+3531 =4884

  上例用了4步得到回文数,在这里的一步是指进行了一次N进制的加法

    写一个程序,给定一个N(2<=N<=10)进制数 , M(小于1000位数),求最少经过几步可以得到回文数。

   如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”

输入

N和M

输出

步数

样例输入

9

87

样例输出

STEP=6

代码:

import java.util.Scanner;

public class B {

	public static void main(String[] args) {
		
		Scanner sc=new Scanner(System.in);
		int k=sc.nextInt();
		String num=sc.nextInt()+"";

		boolean fa=getBool(num);

		int conut=0;
		while(fa==false){
			String str=getAdd(k,num);
			num=str;
			fa=getBool(str);
			conut++;
			System.out.println(num);
		}
		System.out.println("STEP="+conut);
	}
	private static boolean getBool(String str) {
		int le=str.length();
		for (int i = 0; i < le/2; i++) {
			if(str.charAt(i)!=str.charAt(le-i-1)){
				return false;
			}
		}
		return true;
	}
	//K进制的加法
	private static String getAdd(int k,String num) {
		String str="";
		int jw=0;
		int le=num.length()-1;
		for (int i = num.length()-1; i >= 0; i--) {
			int x=(num.charAt(i)+num.charAt(le-i))-2*'0'+jw;
			str=x%k+str;
			jw=x/k;
		}
		if(jw==1)
			str=1+str;
		return str;
	}
}


问题 C: 我才是难题

时间限制: 1 Sec  内存限制: 128 MB

题目描述

  话说,小C经过上次被小T实力坑了一把以后呀,他就决定发明一个数字游戏来坑一坑小T!游戏规则是这样~

在游戏开始前,小C会任意的选出一个正整数n(1≤n≤2^32-1),同时令m=1。在玩的过程当中,小C和小T每个人都可以将m的值扩大2到9中的任意倍数(倍数一定是整数),两个人一人扩大一次,第一个使m≥n的人就是最后的赢家。

因为两个人都在互相算计,所以都是用的最佳策略,问最后是谁赢?

(上次因为吃了先手的亏,小C决定先手,也就是说:每次都是小C第一个玩)。

1

2~9 C

10~18 T

19~36

 

输入

多组输入(文件尾结束)

每行一个正整数n

输出

对于每个结果:

如果小C赢,则输出"C",

如果小T赢,则输出"T"。

(记得换行!!)

样例输入

9

样例输出

C

提示

别说学长坑你们,给你们一点提示:  找规律!!

代码:

import java.util.Scanner;

public class C {

	public static void main(String[] args) {
		
		double[] arr=new double[18];

		//划分赢的区间
		arr[0]=2;
		arr[1]=9;
		for (int i = 2; i < arr.length; i+=2) {
			arr[i]=arr[i-1]*2+1;//2 2*9+1  18*2*9+1
			arr[i+1]=(arr[i]-1)*9;//2*9*9 18*9*2*9
		}
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		for (int i = 0; i < arr.length; i+=2) {
			if(n==1||(arr[i]<=n && arr[i+1]>=n)){
				System.out.println("C");
				return;
			}else if(arr[i+1]<n && arr[i+2]>n){
				System.out.println("T");
				return;
			}
		}
	}
}


问题 D: 楼上都是骗人的

时间限制: 1 Sec  内存限制: 128 MB

题目描述

有小明和小曹两个无聊的人,对字符串操作起了兴趣,小曹给出一个由小写字母构成的字符串,小明给出另一个比小曹更长的字符串,也由小写字母组成,如果能通过魔法转换使小明的串和小曹的变成同一个,那么他们两个人都会很开心。这里魔法指的是小明的串可以任意删掉某个字符,或者把某些字符对照字符变化表变化。如: 
小曹的串是 abba; 
小明的串是 addba; 
字符变化表 d b (表示d能转换成b)。 
那么小明可以通过删掉第一个d,然后将第二个d转换成b将串变成abba。 
现在请你帮忙判断:他们能不能通过魔法转换使两个人的串变成一样呢?

输入

 首先输入T,表示总共有T组测试数据(T <= 40)。 
  接下来共T组数据,每组数据第一行输入小曹的字符串,第二行输入小明的字符串(数据保证字符串长度不超过1000,小明的串的长度大于等于小曹的,且所有字符均为小写字母)。接着输入字母表,先输入m,表示有m个字符变换方式(m< = 100),接着m行每行输入两个小写字母,表示前一个可以变为后一个(但并不代表后一个能变成前一个)。

输出

 对于每组数据,先输出Case数。 
如果可以通过魔法转换使两个人的串变成一样,输出“happy”, 
否则输出“unhappy”。 
每组数据占一行,具体输出格式参见样例。

样例输入

2

abba

addba

1

d b

a

dd

0

样例输出

Case #1:happy


Case #2: unhappy

代码:(没做出来,先占坑位)



问题 E: 真·难题

时间限制: 0Sec  内存限制: 128 MB

题目描述

上了大学的小明又在做题了,他好累,所以请你帮忙:

设n为正整数,令f(n)为所有gcd(x,y)的最大值,且x和y满足1<=x<y<=n,其中gcd指最大公约数。

举个例子:当n=3时,x,y可以取1,2或1,3或2,3,gcd(x,y)的最大值为1,因此f(3)=1。

给定正整数n,求当2<=i<=2*n+1时,所有f(i)的平方和。

输入

多组输入,最多100组

每组一个正整数 n < 10^9.

输出

仅一行,所求结果对10007取模的结果。

样例输入


3


样例输出


28



public class E {

	public static void main(String[] args) {
		
		int n=2;//1652087318
		double sum=0;
		int x=0;
		for (int i = 2; i <= 2*n+1; i++) {
			x=(i/2%10007);
			sum+=(x*x%10007);
		}
		System.out.println((int)sum%10007);
	}
}


问题 F: 还有比我更难的题?

时间限制: 1 Sec  内存限制: 128 MB

题目描述

拉丁方的定义: n个不同的符号(这里取1到n),在n*n的方阵中每个符号在每一行和每一列均只出现一次,那么我们称此方阵为n阶的拉丁方

最小n阶拉丁方最小拉丁方中每行所表示的十进制数最小

输入

多组输入,每组一个n ( n <= 12 ) 

输出

输出最小拉丁方,每组输出数据之间用一个换行隔开

样例输入

1

2

样例输出

1

 

1 2

2 1

代码:(看不懂啥意思)


问题 G: 反正楼下都是简单题

时间限制: 1 Sec  内存限制: 2 MB

题目描述

问题很简单,找出现了3*k-1次的数 k > 0 )

输入

输入一个 n 接下来就是n个数

确保有一个数出现了 3*k-1次,其余数都出现了3*m 次 (m > 0 )

对于所有的数在int范围内,且n小于216660

输出

找出现了3*k-1次 的那个数

样例输入

5

3 3 3 2 2

样例输出

2

代码:

import java.util.Scanner;

public class G {

	public static void main(String[] args) {
		
		int[] arr=new int[32];
		Scanner sc=new Scanner(System.in);
		int c=sc.nextInt();
		for (int j = 0; j < c; j++) {
			String str=getRE(sc.nextInt());
			for (int i = str.length()-1,k=arr.length-1; i >= 0; i--,k--) {
				arr[k]+=str.charAt(i)-'0';
				if(arr[k]==3)//满3清零
					arr[k]=0;
			}	
		}
		
		//将二进制转成十进制
		int sum=0;
		for (int i = 0,k=arr.length-1; i < arr.length; i++,k--) {
			sum+=arr[k]*(int)Math.pow(2,i);
		}
		System.out.println(sum/2);
	}
	
	//转二进制
	private static String getRE(int i) {
		String str="";
		while(i>0){
			str=i%2+str;
			i=i/2;
		}
		return str;
	}
}

问题 H: 听说有人说我是简单题?

时间限制: 1 Sec  内存限制: 3 MB

题目描述

    小C和小T骑车去郊游,小T先出发,速度为x米每分钟,行驶m分钟后,小C带着一条狗出发,小C的速度为y米每分钟,而狗则以每分钟z米的速度向小T跑去,追上小T后又会返回,如此往复,直到小C追上小T。问:当小C追上小T的时候,狗跑了多远?

输入

第一行输入一个整数N,表示测试数据的组数(N<100)
每组测试数据占一行,是四个正整数,分别为m,x,y,z(数据保证X<Y<Z)

输出

输出狗跑的路径长度,结果保留小数点后两位。

样例输入

1

5 10 15 20

样例输出

200.00

代码:

import java.math.BigDecimal;

public class H {

	public static void main(String[] args) {

		getLC(5,10,15,20);

	}

	private static void getLC(int m, int x, int y, int z) {
		
		int t=m*x/(y-x)*z;
		BigDecimal bd=new BigDecimal(t);
		String s=bd.setScale(2,BigDecimal.ROUND_HALF_UP).toString();
		System.out.println(s);
		
	}
}


问题 I: 不要吵了,我才是难题

时间限制: 1 Sec  内存限制: 128 MB

题目描述

打酱油路过,吉首大学第六届新星杯暨程序设计大赛-题解-Java_数据

小小成现在拥有n根火柴,假设小小成只能按照上图的方式用火柴摆数字,并且不能进行任何运算,而且必须

用完所有火柴棍,请问能摆出来的最大数字次大数字是多少。

输入

多组输入(最多 2000 组) 

每组数据仅一行,包含一个正整数 n 。

  1 ≤ n≤2000

输出

对于每组数据输出一行,如果能摆出来的最大数字次大数字都存在,则这一行包含两个非负整数,表示能摆出来的最大数字和次大数字

否则在这一行输出 small small cheng is silly boy

样例输入

5

1

样例输出

71 17

small small cheng is silly boy

代码:

public class I {
			//0,1,2,3,4,5,6,7,8,9
	static int[] arr={6,2,5,5,4,5,6,3,7,6};
	public static void main(String[] args) {
		int n=8;
		if(n<4){
			System.out.println("mall small cheng is silly boy");
			return;
		}
		if(n==4){
			System.out.println("11 4");
			return;
		}
		String str=getMax(n);
		System.out.print(str+" ");
		if(str.indexOf("7")!=-1){
			str="17"+str.substring(2);
		}else{
			str="77"+str.substring(3);
		}
		System.out.println(str);
	}
	private static String getMax(int i) {
		String str="";
		while(i/2>1){
			str=str+"1";
			i=i-2;
		}
		System.out.println(i);
		if(i==2){
			str=str+"1";
		}else if(i!=0){
			str="7"+str;
		}
		return str;
	}
}



问题 J: 我就静静的不说话

时间限制: 5 Sec  内存限制: 128 MB

题目描述

    实验室除了是一个学习的地方,更是一个非常好玩的地方,有各种各样的活动充斥在学习之间。

    在某一次活动中,黄sir带着大家一起去爬山。历经了千辛万苦后终于爬上了山顶,大家是又累又渴。。但是在山顶,只有一口井,每次只能容下一个人去打水。那么问题来了!

  现在假设实验室有n个人,每个人打水的时间为ai,请给出一个排队的规则,使所有人的平均等待时间最小!

注意:若两个人的等待时间相同,则序号小的优先。

输入

多组输入

每组两行

第一行为n,表示有多少个人

第二行有n个数,分别表示每个人打水的时间a[1],a[2],a[3],a[4],……a[n],每个数据之间有一个空格

数据范围: 0<n<=1000, 0<a[i]<=1000 

输出

对于每组输入

输出有两行(格式见样例)

第一行为使所有人的平均等待时间最小的排队顺序

第二行为最小的平均等待时间(输出结果精确到小数点后两位)

样例输入

10

56 12 1 99 1000 234 33 55 99 812

样例输出

3 2 7 8 1 4 9 6 10 5

291.90

代码:

import java.math.BigDecimal;
import java.util.Scanner;

public class J {

	public static void main(String[] args) {
		
		//java.text.DecimalFormat df =new java.text.DecimalFormat("#.00");  
		//System.out.println(df.format(235.005));
//		double sum1=523.200;
//		BigDecimal d=new BigDecimal(sum1);
//		String ss=d.setScale(2,BigDecimal.ROUND_HALF_UP).toString();
//		System.out.println(ss);
//		try {
//			double num=544.000;
//			String s=num+"000";
//			int a=s.indexOf(".");
//			int x=s.charAt(a+3)-'0';
//			int y=s.charAt(a+2)-'0';
//			if(x>4){
//				y=(y+1)%10;
//				num+=0.01;
//			}
//			s=(num+"").substring(0,a+2)+y;
//			System.out.println(s);
//		}catch (Exception e) {}
		
		
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int[] arr1=new int[n];
		int[] arr2=new int[n];
		double sum=0;
		for (int i = 0; i < arr2.length; i++) {
			arr1[i]=sc.nextInt();
			arr2[i]=i+1;
		}
		for (int i = 0; i < arr2.length; i++) {
			for (int j = 0; j < arr2.length; j++) {
				if(arr1[i]<arr1[j]){
					int tmep=arr1[i];
					arr1[i]=arr1[j];
					arr1[j]=tmep;
					
					int k=arr2[i];
					arr2[i]=arr2[j];
					arr2[j]=k;
				}
			}
		}
		for (int i = 1; i < arr1.length; i++) {
			sum+=arr1[i-1]*(n-i);
		}
		for (int i = 0; i < arr2.length; i++) {
			System.out.print(arr2[i]+" ");
		}
		System.out.println();
		sum=sum/n;
		BigDecimal d=new BigDecimal(sum);
		String s=d.setScale(2, BigDecimal.ROUND_HALF_UP).toString();
		System.out.println(s);
	}
}


问题 K: 冷漠.jpg

时间限制: 1 Sec  内存限制: 128 MB

题目描述

最近发现了一些神奇的数字,就是各个位都不相同的四位数,如1234 ,把所有数字从大到小排序后得到的数,减去从小到大得到的数,一直如此减下去,竟然一定会得到6174,那么你能求出要多少次这样的操作才能得到6174吗?

例如,从1234出发,依次可以得到4321-1234=3087、8730-378=8352、8532-2358=6174。这样就回到了6174。操作步数为3,所以输出3。

输入

第一行输入n,代表有n组测试数据。
接下来n行每行都写一个各位数字互不相同的四位数

输出

经过多少次上面描述的操作才能出现6174。

样例输入

1

1234

样例输出

3

提示

代码:

import java.util.Scanner;

public class K {

	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int n=Integer.parseInt(sc.nextLine());
		
		int[] arr=new int[n];
		for (int i = 0; i < arr.length; i++) {
			String str=sc.nextLine();
			int conut=0;
			while(!str.equals("6174")){
				str=getConut(str);
				conut++;
			}
			arr[i]=conut;
		}
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}

	private static String getConut(String nextInt) {
		String max="",min="";
		while (max.length()<nextInt.length()) {
			
			for (int i = 0; i < 10; i++) {
				if((nextInt).indexOf(""+i)!=-1){
					max=i+max;
					min=min+i;
				}
			}
		}
		int a=Integer.parseInt(max);
		int b=Integer.parseInt(min);
		return a-b+"";
	}
}

PS:有些代码可能还存在问题

举报

相关推荐

0 条评论