/*
* 中国古代文献中,曾记载过“大衍数列”, 主要用于解释中国传统文化中的太极衍生原理。
* 它的前几项是:0、2、4、8、12、18、24、32、40、50 ...
* 其规律是:对偶数项,是序号平方再除2,奇数项,是序号平方减1再除2。
* 以下的代码打印出了大衍数列的前 100 项。
for(int i=1; i<100; i++)
{
if(________________) //填空
System.out.println(i*i/2);
else
System.out.println((i*i-1)/2);
}
*请填写划线部分缺失的代码。通过浏览器提交答案。
*/
public class _031大衍数列 {
public static void main(String[] args) {
for(int i=1; i<100; i++)
{
if(i % 2 == 0) //填空
System.out.println(i*i/2);
else
System.out.println((i*i-1)/2);
}
}
}
/*
* 数学发展历史上,圆周率的计算曾有许多有趣甚至是传奇的故事。其中许多方法都涉及无穷级数。
* 如图中所示,就是一种用连分数的形式表示的圆周率求法。
* 下面的程序实现了该求解方法。实际上数列的收敛对x的初始值 并不敏感。
* 结果打印出圆周率近似值(保留小数点后4位,并不一定与圆周率真值吻合)。
* double x = 111;
* for(int n = 10000;n >= 0;n--){
* int i = 2 * n + 1;
* x = 2 + (i*i / x);
* }
*
* System.out.println(String.format("%.4f",_______));
*
* 思路
* 极限 -->当n=0时,i=1,x=2+1/x,与图相比多了1,减去,即Π=4/(x-1)
*/
public class _032圆周率 {
public static void main(String[] args) {
double x = 111;
for(int n = 10000;n >= 0;n--){
int i = 2 * n + 1;
x = 2 + (i*i / x);
}
System.out.println(String.format("%.4f",4/(x-1)));
}
}
/*
* 上小学的时候,小明经常自己发明新算法。一次,老师出的题目是:
* 1/4 乘以 8/5
* 小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png)
* 老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼!
* 对于分子、分母都是 1~9 中的一位数的情况,还有哪些算式可以这样计算呢?
* 请写出所有不同算式的个数(包括题中举例的)。
* 显然,交换分子分母后,例如:4/1 乘以 5/8 是满足要求的,这算做不同的算式。
* 但对于分子分母相同的情况,2/2 乘以 3/3 这样的类型太多了,不在计数之列!
*
* 注意:答案是个整数(考虑对称性,肯定是偶数)。请通过浏览器提交。不要书写多余的内容。
*
* 思路
* 写出等式
*/
public class _033奇怪的分式 {
private static int count;
public static void main(String[] args) {
for(int a = 1;a < 10;a++) {
for(int b = 1;b < 10;b++) {
for(int c = 1;c < 10;c++) {
for(int d = 1;d < 10;d++) {
if (a == b || c == d) {//分子分母相同跳过
continue;
}
if ((10*a+c)*b*d == (10*b+d)*a*c) {//条件
count++;
}
}
}
}
}
System.out.println(count);
}
}
import java.util.HashSet;
import java.util.Set;
/*
* A A 2 2 3 3 4 4, 一共4对扑克牌。请你把它们排成一行。
* 要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。
* 请填写出所有符合要求的排列中,字典序最小的那个。
* 例如:22AA3344 比 A2A23344 字典序小。当然,它们都不是满足要求的答案。
*
* 请通过浏览器提交答案。“A”一定不要用小写字母a,也不要用“1”代替。字符间一定不要留空格。
*
* 思路
* 全排列+检查(set去重)
* public int lastIndexOf(int ch):
* 返回指定字符在此字符串中最后一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
*
*/
public class _034扑克序列 {
public static void main(String[] args) {
char[] a = {'A','A','2','2','3','3','4','4'};
f(a,0);
//输出set
for (String s : set) {
System.out.println(s);
}
}
//去重
static Set<String> set = new HashSet<>();
private static void f(char[] a, int k) {
//出口
if (k == a.length) {
String s = new String(a);//把字符数组转成字符串
if (check(s)) {//检查
//System.out.println(s);
set.add(s);
}
}
//全排列
for(int i = k;i < a.length;i++) {
char temp = a[k];
a[k] = a[i];
a[i] = temp;
f(a, k+1);
temp = a[k];
a[k] = a[i];
a[i] = temp;
}
}
//检查
private static boolean check(String s) {
if (s.lastIndexOf('A') - s.indexOf('A') == 2 &&
s.lastIndexOf('2') - s.indexOf('2') == 3 &&
s.lastIndexOf('3') - s.indexOf('3') == 4 &&
s.lastIndexOf('4') - s.indexOf('4') == 5) {
return true;
}else {
return false;
}
}
}
import java.util.Scanner;
/*
* 有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:
* 每个小朋友都把自己的糖果分一半给左手边的孩子。
* 一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。
* 反复进行这个游戏,直到所有小朋友的糖果数都相同为止。
* 你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。
*
* 输入格式
* 程序首先读入一个整数N(2< N< 100),表示小朋友的人数。
* 接着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2)
*
* 输出格式
* 要求程序输出一个整数,表示老师需要补发的糖果数。
*
样例输入
3
2 2 4
样例输出
4
*/
public class _035分糖果 {
public static void main(String[] args) {
//输入
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n];
for(int i = 0;i < n;i++) {
a[i] = sc.nextInt();
}
int count = 0;//补发次数
while (true) {
int temp = a[0];
for(int i = 0;i <= n-2;i++) {
a[i] -= a[i] / 2;//给一半糖果
a[i] += a[i + 1] / 2;//获得右边的一半糖果
if (a[i] % 2 != 0) {//是奇数,补发
count++;
a[i]++;
}
}
//最后一位的糖果
a[n-1] -= a[n-1] / 2;
a[n-1] += temp / 2;
if (a[n-1] % 2 != 0) {
count++;
a[n-1]++;
}
if (check(a,n)) {//相等就输出并结束循环
System.out.println(count);
return;
}
}
}
//检查糖果数量是否相等
private static boolean check(int[] a,int n) {
int temp = a[0];
for(int i = 1;i < n;i++) {
if (a[i] != temp) {
return false;
}
}
return true;
}
}