切面条
一根高筋拉面,中间切一刀,可以得到2根面条。
如果先对折1次,中间切一刀,可以得到3根面条。
如果连续对折2次,中间切一刀,可以得到5根面条。 那么,连续对折10次,中间切一刀,会得到多少面条呢?
方法一:递归
package CSDN_base;
import java.util.*;
public class p1_01_f1 {
// 切面条
// 不对折时切一刀有2条;f(0)=2;
// f(x)=2*f(x-1)-1
// f(0) = 2 (不对折时切一刀有2根面条)
// f(x) = 2*f(x-1) - 1 (对折x次后切一刀的面条数量是前一次切面条数量的两倍-1)
public static void main(String[] args) {
Scanner sc=new Scanner (System.in);
int x=sc.nextInt();
System.out.println(f(x));
}
public static int f(int x) {//x为对折的次数
if(x==0) {//f(0)=2
return 2;
}else {
return 2*f(x-1)-1;//每次对折都会增加一倍的面条数量。
//1 2f(1-0)-1=2*f(0)-1=2*1-1=3
//2 2*f(2-1)-1=2*f(1)-1=2*3-1=5
//3 2*f(3-1)-1=2*f(2)-1=2*5-1=9
//……
//10 2*f(10-1)-1=2*f(9)-1=1025
}
}
}
方法二:前缀和
package CSDN_base;
public class p1_01_f2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int n=10;//n代表对折的次数
int []sum=new int [n+1];
sum[0]=2;
for (int i = 1; i <=10; i++) {
sum[i]=2*sum[i-1]-1;//1 sum[1]=2*sum[0]-1=2*2-1=3
//2 sum[2]=2*sum[1]-1=2*3-1=5
}
System.out.println(sum[n]);
}
}
排它平方数
203879 * 203879 = 41566646641
这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。
具有这样特点的6位数还有一个,请你找出它!
再归纳一下筛选要求:
- 6位正整数
- 每个数位上的数字不同
- 其平方数的每个数位不含原数字的任何组成数位
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
public class p1_16 {
// 排它平方数
public static void main(String[] args) {
// TODO Auto-generated method stub
for (long i =100000; i <1000000; i++) {
String n=i+"";//将数字转换为字符串。
// System.out.println(n);
char ch[]=n.toCharArray();
long sum = 0;
long num = Integer.parseInt(n); //将字符串转化位Long型
LinkedHashSet<Character> set=new LinkedHashSet<Character>();//创建LinkedHashSet,来检查元素是否重复
for (int j = 0; j < ch.length; j++) {
set.add(ch[j]);
}
if(set.size()==6) {//如果长度为6,则该6位数符合
//System.out.println(set);
sum=num*num;
//String sum1=Long.toString(sum);//将sum转化为String
char[]sum2=Long.toString(sum).toCharArray();//将String转化为char
List<Character>list =new ArrayList<>();//创建list,目的为了来判断list与set的交集
for (int j = 0; j < sum2.length; j++) {
list.add(sum2[j]);
}
List<Character>resSet=new ArrayList<Character>();//创建list,将set添加到resSet
resSet.addAll(set);
resSet.retainAll(list);
if(resSet.size()==0) {//如果set n list长度为1,这集合set与list 没有重复
System.out.println(i);//输出i值
}
//System.out.println(resSet);
//System.out.println(list);
}
}
}
}
分数
1/1 + 1/2 + 1/4 + 1/8 + 1/16 + … 每项是前一项的一半,如果一共有20项,求这个和是多少,结果用分数表示出来。
类似:3/2
当然,这只是加了前2项而已。分子分母要求互质。
public class p2_06_f1 {
//分数
public static void main(String[] args) {
// TODO Auto-generated method stub
int n=20;
int []fm=new int [n+1];
double total=0;
fm[1]=1;
for (int i = 2; i <= 20; i++) {
fm[i]=fm[i-1]*2;//fm[2]=fm[1]*2=2
//fm[3]=fm[2]*2=4
}
for (int i = 1; i <fm.length; i++) {
total+=(double)1/fm[i];
}
System.out.println(total);
}
}
次数差
问题描述
x星球有26只球队,分别用 a ~ z 的26个字母代表。他们总是不停地比赛。
在某一赛段,哪个球队获胜了,就记录下代表它的字母,这样就形成一个长长的串。
国王总是询问:获胜次数最多的和获胜次数最少的有多大差距?
(当然,他不关心那些一次也没获胜的,认为他们在怠工罢了)
输入格式
一个串,表示球队获胜情况(保证串的长度<1000)
输出格式
要求输出一个数字,表示出现次数最多的字母比出现次数最少的字母多了多少次。
样例输入1
abaabcaa
样例输出1
4
提示
a 出现 5 次,最多;c 出现1次,最少。
5 - 1 = 4
样例输入2
bbccccddaaaacccc
样例输出2
6
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class p2_09_f2 {
//次数差
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
String str=sc.nextLine();
char[] ch=str.toCharArray();
Map<Character, Integer> map = new HashMap<Character, Integer>();
for (int i = 0; i < ch.length; i++) {
map.put(ch[i], 0);//v=0
}
System.out.println(map);
// System.out.println(map.get('a'));
for (char c : ch) {
map.put(c, map.get(c)+1);
// System.out.print(map+" ");
}
System.out.println(map.get('a'));
System.out.println(map);
// //记录最多出现次数的字符。 Collections.max():找出集合中的最大元素。
int max = Collections.max(map.values());
// //记录最小出现次数的字符。 Collections.min():找出集合中的最小元素。
int min = Collections.min(map.values());
//
int difference = max - min;
System.out.println(difference);
}
}
成绩分析
问题描述
小蓝给学生们组织了一场考试,卷面总分为100分,每个学生的得分都是一个0到100的整数。
请计算这次考试的最高分、最低分和平均分。
输入格式
输入的第一行包含一个整数n,表示考试人数。
接下来n行,每行包含一个0至100的整数,表示一个学生的得分。
输出格式
输出三行。
第一行包含一个整数,表示最高分。
第二行包含一个整数,表示最低分。
第三行包含一个实数,四舍五入保留正好两位小数,表示平均分。
样例输入
7
80
92
56
74
88
99
10
样例输出
99
10
71.29
方法一:
import java.util.Scanner;
import java.util.Arrays;
public class p2_13_f1 {
//成绩分析
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int []arr=new int [n];
int sum=0;
for (int i = 0; i < n; i++) {
arr[i]=sc.nextInt();
}
for (int i = 0; i < arr.length; i++) {
sum+=arr[i];
}
double avg=(double)sum/n;//平均分
Arrays.sort(arr);
int max=arr[n-1];//获取最大值
int min=arr[0];//获取最小值
System.out.println(max);
System.out.println(min);
System.out.printf("%.2f",avg);
}
}
方法二:
package CSND_easily;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class p2_13_f2 {
//成绩分析
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int []arr=new int [n];
for (int i = 0; i <arr.length; i++) {
arr[i]=sc.nextInt();
}
double sum=0;
List<Integer>list=new ArrayList<>();
for (int i = 0; i <arr.length; i++) {
list.add(arr[i]);
sum+=list.get(i);
}
double avg=sum/n;
int max = Collections.max(list);//获取List最大值
int min=Collections.min(list);//获取List最小值
System.out.println(max);
System.out.println(min);
System.out.printf("%.2f",avg);
}
}