DataInputStream in=new DataInputStream(System.in);
x=in.readDouble();
System.out.println(x);
输入数字后为什么输出的是一大串数字?从键盘怎么读入数字?
JTextField tx=new JTextField(10);
String a=tx.getText()
如果输入的是数字,怎么把String转换成int类型用于计算?50分求一算法
有n个不同的球,m个盒子,每个盒子至少要有k个球,求放法.需要判断n,m,k的关系.
最好给个完整代码.谢谢
x=in.readDouble();
System.out.println(x);
输入数字后为什么输出的是一大串数字?从键盘怎么读入数字?
JTextField tx=new JTextField(10);
String a=tx.getText()
如果输入的是数字,怎么把String转换成int类型用于计算?50分求一算法
有n个不同的球,m个盒子,每个盒子至少要有k个球,求放法.需要判断n,m,k的关系.
最好给个完整代码.谢谢
2.new Integer(a)
3.判断关系?看得不太明白.---------------------
1.lz需要学习使用jdk文档
2.同1,并且lz需要加强基础知识的掌握.
3.数据结构与算法? 抱歉这个我也很菜喵~~~``
或者有个valueofint();
有n个不同的球,m个盒子,每个盒子至少要有k个球,这个就行.
问题,1,2已解决.再次谢谢
System.in.read()这条语句默认读出的数据是char的,然后就转换成int数据,所以你的(int)转型不用都可以,写成:a=System.in.read(); 结果还是一样的。
因为默认接收到的是char型的,然后才转换成int型,所以你应该要知道char和int的对应关系
char '0' 对应 int 48
char '1' 对应 int 49
……如此类推
char '9' 对应 int 57char 'a' 对应 int 97
char 'b' 对应 int 98
…………
你自己查查资料。你还要了解的是System.in.read();每次只读取一个char。就是说如果你输入102,你第一次使用System.in.read();读到的char 1 ,然后转换成int 就是49 ,如果你再使用System.in.read();读取,就会读到 char 0,结果转换成int 就是 48,再使用System.in.read();读取就是 char 2 ,转换成 int 50。如果你输入a,就会得到int 97。因此,你无论输入什么数字,因为都是只读了第一个数字,所以都会比58小。但是如果你输入a,就会比60打,因为其实得到的是int 97。
记得 输入啊
k*m = n 刚好全放满
k*m < n 需要再次将剩余的球放(n - k*m)次直到n个球全部放完为止
为了验证完整性,添加每个盒子里放不满k个小球的情况,当作异常抛出即可...
分情况讨论
第一:若n<1或者m<1或者k<1
数据不合法,不讨论
第二:若n>1并且m>1并且k>1 有下面情况
1: 若 n<m*k 球的总数量不够,不能达到要求
2: 若 n>=m*k 有下面的情况
若n-m*k<=m 方法有n-m*k种(这里只考虑组合,不考虑顺序,即对m个盒子的顺序无要求)
若n-m*k>m 请把他看做上面操作一个多个n-m*k=m 和一个n-m*k<m的组合
令a=(n-m*k)%m b=[(n-m*k)-a]/m 可以肯定b>=1
若b=1 有 m*a 种组合 2个相关步骤组合相乘
若b=2 有 m*m*a种组合 3个相关步骤组合相乘
.
.
对于任意b有 m^b*a种组合
即当n-m*k>m时有m^[(n-m*k)-(n-m*k)%m]/m*[(n-m*k)%m]总感觉还是不对,哎,数学都忘记了
有n个不同的球,m个盒子,每个盒子至少要有k个球,求放法.需要判断n,m,k的关系.
最好给个完整代码.谢谢
================================================================
"需要判断n,m,k的关系."
不太理解什么意思 是分前判断n>m*k n=m*k n<m*k吗 还是分完了 来判断每种方法的n,m,k的具体关系
如果是前一种
n<m*k 不满足条件“每个盒子至少要有k个球”
n=m*k 那每个盒子K个球 只有一种放法
n>m*k 无非就是把n-m*k个球放到n个盒子里有多少种方法
n-m*k个球最少放在一个盒子里 最多放在n-m*k个盒子里
共有方法
……
这里还一个问题 你说的"有n个不同的球,m个盒子," 我想知道到底是球不同 还是盒子不同 或者2者都不同 这个差别大了
==============================================================================================
k个相同的球放到n个不同的盒子里,盒子可以为空,也可以放入多个球,共有多少种放法?
这题只要转化一下就可以变成熟悉的模型了。实际上就是要把k个球分成n组,我们可以用n-1个隔板来搞这个事(隔板...大大有用的东西)。我们把n-1个隔板和k个球放到一排搞排列,共有(k+n-1)!种方法,慢!隔板和球都是无区别的东东,所以我们还要除以k!和(n-1)!(即可重排列),这样就是(k+n-1)!/(k!*(n-1)!),变一下就是 C(k+n-1,k) or C(k+n-1,n-1)。搞定了,其实这就是可重组合,从n个元素中选出k个元素,元素可允许重复选(那么k是可以大于n的),方案数就是C(k+n-1,k) 。比如1,2,3,4四个数里面选3个数(可重复),就有1 1 1,1 1 2 ,1 1 3,1 1 4,1 2 2....反正就是C(4+3-1,3)=20种方案咯。那个盒子与球实际上就是:n个盒子就相当于n个元素,某个盒子里的球数就相当于这个元素被选了几次,就是这样。还有像什么方程x1+x2+x3+x4=10共有多少组非负整数解,其实就是4个元素选10个的可重组合。
==============================================================================================
那么如果是n个不同的球放到m个相同的盒子里的方案数呢(不允许有盒子为空)?
这就是组合数学中比较有名的第二类Stirling数了,我们用S(n,m)来表示方案数。这样就会有一些神奇的东东了:
S(n,0)=0, S(n,1)=1, S(n,2)=2(n-1) -1 [2的(n-1)次方减1], S(n,n-1)=C(n,2), S(n,n)=1.
第三个: 我们把第一个球随便放在一个盒子里,后面的n-1个球都有两种放法,和第一个球同盒或不同盒,但最后要减去所有球都在一个盒子里的情况。
第四个: 肯定有且只有一个盒子里有两个球,方案数即选出这两个球的方案数。
其他的都是显而易见的吧
Last but not least: 最重要的递推: 第二类stirling数满足这样一个递推关系式
S(n,m)=m*S(n-1,m)+S(n-1,m-1) {n>1,m>1} 我们考虑前n-1个球已放好,现在放第n个球,即最后一个球。
情况1: 放最后一个球时已无空盒,前n-1个球放到m个盒中共S(n-1,m)种方法,而最后一个球有
m个盒子可选,根据乘法原理,方案数为m*S(n-1,m)
情况2: 最后一个球单独占一个盒,因为随便占哪个盒都一样(盒子无区别),所以就是前n-1个
球放到m-1个盒子里,最后一个丢到空的那个,方案数为S(n-1,m-1)
加法原理一加就搞定了。
编程的时候就是用的这样一个递推,递推是OI中常用的算法,比如编程计算组合数时都不是一个个去算,而是用这个公式:C(n,m)=C(n-1,m-1)+C(n-1,m),这样效率就高得多了。
vijos上有道这样的题:求n个不同的球放到m个不同的盒子里(不允许有空盒)方案数。
仔细想想,不就是第二类Stirling数再去把盒子全排列一下么?
设它为D(n,m)
有 D(n,m)=m!*S(n,m)=m*m!*S(n-1,m)+m*(m-1)!*S(n-1,m-1)=m*(D(n-1,m)+D(n-1,m-1)) 这样就得出了D(n,m)的递推式,可以去交那道题了。
这一类球与盒子的问题,可以根据球有无区别,盒子有无区别,是否允许有空盒,搞出8种情况,上面
只介绍了3种,其他的大家有兴趣可以自己推推,比较好玩。
==============================================================================================
问题:n个球放到t个盒子里;n个球 t个盒子 是否允许有空盒子 方案数
球不同 盒子不同 允许 t^n
球不同 盒子不同 不允许 t!*(第二类Stirling数)
球不同 盒子相同 允许 从i=1到t的t个(第二类Stirling数)相加
球不同 盒子相同 不允许 (第二类Stirling数)
球相同 盒子不同 允许 C(n+t-1,n)
球相同 盒子不同 不允许 C(n-1,t-1)
球相同 盒子相同 允许 (需用生成函数,略)
球相同 盒子相同 不允许 (需用生成函数,略)
只要求将n-m*k个球放到m个盒子的情况就行了