求告知这几题如何用Java实现

花. 2019-04-22 12:42:37
煤球数目

有一堆煤球,堆成三角棱锥形。具体:
第一层放1个,
第二层3个(排列成三角形),
第三层6个(排列成三角形),
第四层10个(排列成三角形),
....
如果一共有100层,共有多少个煤球?

请填表示煤球总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。


生日蜡烛

某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。

现在算起来,他一共吹熄了236根蜡烛。

请问,他从多少岁开始过生日party的?

请填写他开始过生日party的年龄数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。




搭积木

小明最近喜欢搭数字积木,
一共有10块积木,每个积木上有一个数字,0~9。

搭积木规则:
每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。
最后搭成4层的金字塔形,必须用完所有的积木。

下面是两种合格的搭法:

0
1 2
3 4 5
6 7 8 9

0
3 1
7 5 2
9 8 6 4

请你计算这样的搭法一共有多少种?



分小组

9名运动员参加比赛,需要分3组进行预赛。
有哪些分组的方案呢?

我们标记运动员为 A,B,C,... I
下面的程序列出了所有的分组方法。

该程序的正常输出为:
ABC DEF GHI
ABC DEG FHI
ABC DEH FGI
ABC DEI FGH
ABC DFG EHI
ABC DFH EGI
ABC DFI EGH
ABC DGH EFI
ABC DGI EFH
ABC DHI EFG
ABC EFG DHI
ABC EFH DGI
ABC EFI DGH
ABC EGH DFI
ABC EGI DFH
ABC EHI DFG
ABC FGH DEI
ABC FGI DEH
ABC FHI DEG
ABC GHI DEF
ABD CEF GHI
ABD CEG FHI
ABD CEH FGI



抽签

X星球要派出一个5人组成的观察团前往W星。
其中:
A国最多可以派出4人。
B国最多可以派出2人。
C国最多可以派出2人。
....

那么最终派往W星的观察团会有多少种国别的不同组合呢?

下面的程序解决了这个问题。
数组a[] 中既是每个国家可以派出的最多的名额。
程序执行结果为:
DEFFF
CEFFF
CDFFF
CDEFF
CCFFF
CCEFF
CCDFF
CCDEF
BEFFF
BDFFF
BDEFF
BCFFF
BCEFF
BCDFF
BCDEF
....
(以下省略,总共101行)
...全文
324 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
SunsetColors 2019-04-30
  • 打赏
  • 举报
回复
第一题不是等差数列求和吗
wdonghai 2019-04-29
  • 打赏
  • 举报
回复
真想删除贴出来的代码,可惜CSDN没提供这个功能。
wdonghai 2019-04-24
  • 打赏
  • 举报
回复
第5题:

package jp19042401;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class MyClass
{
private static char a[];
private static ArrayList<Character> d=new ArrayList<Character>();
private static int b[];
private static int m;//d的长度
private static int n=5;
private static StringBuffer gSB=new StringBuffer();//用来剔除重复结果
private static int gCount=0;

private static void init()
{
Map<Character, Integer> map=new HashMap<Character, Integer>();
map.put('A',4);
map.put('B',2);
map.put('C',2);
map.put('D',2);
//将map转换为 'A','A','A','A','B','B','C','C','D','D'存入d中,然后再进行组合输出
int i,iCount;
for (Character key : map.keySet()) {
iCount= map.get(key);
for(i=1;i<=iCount;i++)
d.add(key);
}
iCount=d.size()+1;
a=new char[iCount];
b=new int[iCount];
m=iCount-1;
}

private static void dfs(int step)
{
int i;
if(step>n)
{
StringBuffer sBuffer=new StringBuffer();
for(i=1;i<=n;i++)
sBuffer.append(String.format("%2c", a[i]));
sBuffer.append("\r\n");
String s=sBuffer.toString();
sBuffer.setLength(0);
if(gSB.indexOf(s)!=-1) return;
gCount++;
gSB.append(s);
System.out.print(s);
return;
}

for(i=1;i<=m;i++)
if(b[i]==0)
{
a[step]=d.get(i-1);
if(a[step-1]>a[step]) continue;
b[i]=1;
dfs(step+1);
b[i]=0;
}
}

public static void main(String[] args)
{
// TODO 自动生成的方法存根
init();
dfs(1);
System.out.printf("共 %d个答案", gCount);
}

}

wdonghai 2019-04-23
  • 打赏
  • 举报
回复
第4题分小组的问题,不知道是不是求9个字符的全排列。
第5题是不是缺了D,E,F条件,不然是怎么得出结果是101种组合结果。
第3题积木问题求解:

package jp19042301;

public class MyClass
{
private static int gCount=0;//计数
private static int a[]=new int[10];//存放结果
private static int b[]=new int[10];//标记数组
private static int c[]={1,3,4,6,7,8};
private static int d[]={0,1,3,6};//首行在数组a中的下标
/*
0
1 2
3 4 5
6 7 8 9
将下三角转换为一维数组a,下三角每一行第一个下标对应一维数组a的[0,1,3,6],
分别检测下标[0,1,2,3,4,5]对应的数值
待检测下标 对应下标1 对应下标2
0 1 2
1 3 4
2 4 5
3 6 7
4 7 8
5 8 9
对应下标2=对应下标1+1,只需用数组c记录对应下标1,c=[1,3,4,6,7,8];
*/
private static void dfs(int step)
{
int i,j,k;
if(step>9)
{
for(i=0;i<=5;i++) //检测下标
if((a[i]>a[c[i]]) | (a[i]>a[c[i]+1])) return;

for(i=0;i<=3;i++)
{
for(j=0;j<=i;j++)
{
k=d[i]+j;
System.out.printf("%3d", a[k]);
}
System.out.println();
}
System.out.println();
gCount++;
return;
}

for(i=1;i<=9;i++)
if(b[i]==0)
{
a[step]=i;
b[i]=1;
dfs(step+1);
b[i]=0;
}
}

public static void main(String[] args)
{
// TODO 自动生成的方法存根
gCount=0;
dfs(1);
System.out.println();
System.out.printf("共 %d个答案", gCount);
}

}
花. 2019-04-23
  • 打赏
  • 举报
回复
你第5题是怎么做的
wdonghai 2019-04-22
  • 打赏
  • 举报
回复
解决了前面两个题目

package jp19042201;

public class MyClass
{

public static int retN(int n)
{
if(n==0) return 0;
else if (n==1) return 1;
else return retN(n-1)+n;
}

public static int retAge(int n,int sum)
{
int iRet=-1,t=n;
while(true)
{
sum=sum-t;
if(sum==0)
{
iRet=t;
break;
}
t=t-1;
if(sum<0) return -1;
}

return iRet;
}

public static void main(String[] args)
{
// TODO 自动生成的方法存根
int n=100,sum=0;
for(int i=n;i>0;i--)
{
sum+=retN(i);
}
System.out.printf("%d",sum);//171700
System.out.println();

int iRet;
for(int i=150;i>20;i--)
{
iRet=retAge(i, 236);
if (iRet>0)
{
//System.out.printf("%d至%d", iRet,i);//26至33
System.out.printf("%d", iRet);//26
}
}
}

}

Timor__ 2019-04-22
  • 打赏
  • 举报
回复
前面那题可以用for循环嵌套for循环就可以了

50,504

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧