站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题算法求解,想了好几天没想明白

算法求解,想了好几天没想明白

摘要: 算法求解,想了好几天没想明白


求10有几种加法?如1+9=10;2+3+5=10;......
用java编程实现共有多少中加法?




2有 1 种 1 + 1
3 有 1种 1 + 1
4 有 2种 1 +3,2+ 2
5有 2 种 1+ 4 ,2 + 3
100 有 50 1+ 99。。。。50 + 50

其实就是它本身的数值 除以 2 取整数吧


哥们,你没明白我的意思
比如说
3有两种:1+2=3;1+1+1=3;
4有三中:1+3=4;2+2=4;1+1+2=4;
.....
如此类推


4为什么不可以1+1+1+1


mark


sorry,我也迷糊了,也可以的



最笨的方法
int n=0;
for(int i=0; i<10; i++){
for(int j=0; j<10; j++){
int k = i+j;
if(k==10){
n++
}
}
}


n/2 应该可以简化,不过也没必要只要数不太大,谁让电脑笨呢。


对了,应该i<=10


显然不对


动态规划!


比较笨的方法,一定有比这好的方法:
public class MyAdd
{

public static void main(String[] args)
{


int i,j,m,n;
for(i=1;i<10;i++)
{
for(j=i;j<10;j++)
{
if(10==(i+j))
{
System.out.println("i="+i+"j="+j);
}

}
}

for(i=1;i<10;i++)
{
for(j=i+1;j<10;j++)
{
for(m=j+1;m<10;m++)
{
if(10==(i+j+m))
{
System.out.println("i="+i+"j="+j+"m="+m);
}

}

}
}


for(i=1;i<10;i++)
{
for(j=i+1;j<10;j++)
{
for(m=j+1;m<10;m++)
{
for(n=m+1;n<10;n++)
{
if(10==(i+j+m+n))
{
System.out.println("i="+i+"j="+j+"m="+m+"n="+n);
}

}

}

}
}

}

}


10!+9!+8!+....1!


to:liuzhiyuan
i=1j=9
i=2j=8
i=3j=7
i=4j=6
i=5j=5
i=1j=2m=7
i=1j=3m=6
i=1j=4m=5
i=2j=3m=5
i=1j=2m=3n=4
Press any key to continue...

这样也不符合要求的,还有四位数相加,五位数相加,一直到九位树相加.
辛苦了!!!


import java.util.ArrayList;
import java.util.Iterator;

public class TestAdd {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String[] result=new TestAdd().getAddMethods(10);
for (int i=0;iSystem.out.println("10="+result[i]);
}
}

private String[] getAddMethods(int number) {

ArrayList result = new ArrayList();
if (number == 1) {
return new String[] { "1" };
}
for (int i = 1; i <= number-1; i++) {
String[] subMethods = getAddMethods(number - i);
for (int subIndex = 0; subIndex < subMethods.length; subIndex++) {
StringBuffer sb = new StringBuffer();
sb.append("" + i);
sb.append("+");
sb.append(subMethods[subIndex]);
result.add(sb.toString());
}
}
String resultArray[] = new String[result.size()];
int index = 0;
Iterator it = result.iterator();
while (it.hasNext()) {
resultArray[index++] = (String) it.next();
}
return resultArray;

}

}



运行结果:
10=1+1+1+1+1+1+1+1+1+1
10=1+1+1+1+1+1+1+2+1
10=1+1+1+1+1+1+2+1+1
10=1+1+1+1+1+1+3+1
10=1+1+1+1+1+2+1+1+1
10=1+1+1+1+1+2+2+1
10=1+1+1+1+1+3+1+1
10=1+1+1+1+1+4+1
10=1+1+1+1+2+1+1+1+1
10=1+1+1+1+2+1+2+1
10=1+1+1+1+2+2+1+1
10=1+1+1+1+2+3+1
10=1+1+1+1+3+1+1+1
10=1+1+1+1+3+2+1
10=1+1+1+1+4+1+1
10=1+1+1+1+5+1
10=1+1+1+2+1+1+1+1+1
10=1+1+1+2+1+1+2+1
10=1+1+1+2+1+2+1+1
10=1+1+1+2+1+3+1
10=1+1+1+2+2+1+1+1
10=1+1+1+2+2+2+1
10=1+1+1+2+3+1+1
10=1+1+1+2+4+1
10=1+1+1+3+1+1+1+1
10=1+1+1+3+1+2+1
10=1+1+1+3+2+1+1
10=1+1+1+3+3+1
10=1+1+1+4+1+1+1
10=1+1+1+4+2+1
10=1+1+1+5+1+1
10=1+1+1+6+1
10=1+1+2+1+1+1+1+1+1
10=1+1+2+1+1+1+2+1
10=1+1+2+1+1+2+1+1
10=1+1+2+1+1+3+1
10=1+1+2+1+2+1+1+1
10=1+1+2+1+2+2+1
10=1+1+2+1+3+1+1
10=1+1+2+1+4+1
10=1+1+2+2+1+1+1+1
10=1+1+2+2+1+2+1
10=1+1+2+2+2+1+1
10=1+1+2+2+3+1
10=1+1+2+3+1+1+1
10=1+1+2+3+2+1
10=1+1+2+4+1+1
10=1+1+2+5+1
10=1+1+3+1+1+1+1+1
10=1+1+3+1+1+2+1
10=1+1+3+1+2+1+1
10=1+1+3+1+3+1
10=1+1+3+2+1+1+1
10=1+1+3+2+2+1
10=1+1+3+3+1+1
10=1+1+3+4+1
10=1+1+4+1+1+1+1
10=1+1+4+1+2+1
10=1+1+4+2+1+1
10=1+1+4+3+1
10=1+1+5+1+1+1
10=1+1+5+2+1
10=1+1+6+1+1
10=1+1+7+1
10=1+2+1+1+1+1+1+1+1
10=1+2+1+1+1+1+2+1
10=1+2+1+1+1+2+1+1
10=1+2+1+1+1+3+1
10=1+2+1+1+2+1+1+1
10=1+2+1+1+2+2+1
10=1+2+1+1+3+1+1
10=1+2+1+1+4+1
10=1+2+1+2+1+1+1+1
10=1+2+1+2+1+2+1
10=1+2+1+2+2+1+1
10=1+2+1+2+3+1
10=1+2+1+3+1+1+1
10=1+2+1+3+2+1
10=1+2+1+4+1+1
10=1+2+1+5+1
10=1+2+2+1+1+1+1+1
10=1+2+2+1+1+2+1
10=1+2+2+1+2+1+1
10=1+2+2+1+3+1
10=1+2+2+2+1+1+1
10=1+2+2+2+2+1
10=1+2+2+3+1+1
10=1+2+2+4+1
10=1+2+3+1+1+1+1
10=1+2+3+1+2+1
10=1+2+3+2+1+1
10=1+2+3+3+1
10=1+2+4+1+1+1
10=1+2+4+2+1
10=1+2+5+1+1
10=1+2+6+1
10=1+3+1+1+1+1+1+1
10=1+3+1+1+1+2+1
10=1+3+1+1+2+1+1
10=1+3+1+1+3+1
10=1+3+1+2+1+1+1
10=1+3+1+2+2+1
10=1+3+1+3+1+1
10=1+3+1+4+1
10=1+3+2+1+1+1+1
10=1+3+2+1+2+1
10=1+3+2+2+1+1
10=1+3+2+3+1
10=1+3+3+1+1+1
10=1+3+3+2+1
10=1+3+4+1+1
10=1+3+5+1
10=1+4+1+1+1+1+1
10=1+4+1+1+2+1
10=1+4+1+2+1+1
10=1+4+1+3+1
10=1+4+2+1+1+1
10=1+4+2+2+1
10=1+4+3+1+1
10=1+4+4+1
10=1+5+1+1+1+1
10=1+5+1+2+1
10=1+5+2+1+1
10=1+5+3+1
10=1+6+1+1+1
10=1+6+2+1
10=1+7+1+1
10=1+8+1
10=2+1+1+1+1+1+1+1+1
10=2+1+1+1+1+1+2+1
10=2+1+1+1+1+2+1+1
10=2+1+1+1+1+3+1
10=2+1+1+1+2+1+1+1
10=2+1+1+1+2+2+1
10=2+1+1+1+3+1+1
10=2+1+1+1+4+1
10=2+1+1+2+1+1+1+1
10=2+1+1+2+1+2+1
10=2+1+1+2+2+1+1
10=2+1+1+2+3+1
10=2+1+1+3+1+1+1
10=2+1+1+3+2+1
10=2+1+1+4+1+1
10=2+1+1+5+1
10=2+1+2+1+1+1+1+1
10=2+1+2+1+1+2+1
10=2+1+2+1+2+1+1
10=2+1+2+1+3+1
10=2+1+2+2+1+1+1
10=2+1+2+2+2+1
10=2+1+2+3+1+1
10=2+1+2+4+1
10=2+1+3+1+1+1+1
10=2+1+3+1+2+1
10=2+1+3+2+1+1
10=2+1+3+3+1
10=2+1+4+1+1+1
10=2+1+4+2+1
10=2+1+5+1+1
10=2+1+6+1
10=2+2+1+1+1+1+1+1
10=2+2+1+1+1+2+1
10=2+2+1+1+2+1+1
10=2+2+1+1+3+1
10=2+2+1+2+1+1+1
10=2+2+1+2+2+1
10=2+2+1+3+1+1
10=2+2+1+4+1
10=2+2+2+1+1+1+1
10=2+2+2+1+2+1
10=2+2+2+2+1+1
10=2+2+2+3+1
10=2+2+3+1+1+1
10=2+2+3+2+1
10=2+2+4+1+1
10=2+2+5+1
10=2+3+1+1+1+1+1
10=2+3+1+1+2+1
10=2+3+1+2+1+1
10=2+3+1+3+1
10=2+3+2+1+1+1
10=2+3+2+2+1
10=2+3+3+1+1
10=2+3+4+1
10=2+4+1+1+1+1
10=2+4+1+2+1
10=2+4+2+1+1
10=2+4+3+1
10=2+5+1+1+1
10=2+5+2+1
10=2+6+1+1
10=2+7+1
10=3+1+1+1+1+1+1+1
10=3+1+1+1+1+2+1
10=3+1+1+1+2+1+1
10=3+1+1+1+3+1
10=3+1+1+2+1+1+1
10=3+1+1+2+2+1
10=3+1+1+3+1+1
10=3+1+1+4+1
10=3+1+2+1+1+1+1
10=3+1+2+1+2+1
10=3+1+2+2+1+1
10=3+1+2+3+1
10=3+1+3+1+1+1
10=3+1+3+2+1
10=3+1+4+1+1
10=3+1+5+1
10=3+2+1+1+1+1+1
10=3+2+1+1+2+1
10=3+2+1+2+1+1
10=3+2+1+3+1
10=3+2+2+1+1+1
10=3+2+2+2+1
10=3+2+3+1+1
10=3+2+4+1
10=3+3+1+1+1+1
10=3+3+1+2+1
10=3+3+2+1+1
10=3+3+3+1
10=3+4+1+1+1
10=3+4+2+1
10=3+5+1+1
10=3+6+1
10=4+1+1+1+1+1+1
10=4+1+1+1+2+1
10=4+1+1+2+1+1
10=4+1+1+3+1
10=4+1+2+1+1+1
10=4+1+2+2+1
10=4+1+3+1+1
10=4+1+4+1
10=4+2+1+1+1+1
10=4+2+1+2+1
10=4+2+2+1+1
10=4+2+3+1
10=4+3+1+1+1
10=4+3+2+1
10=4+4+1+1
10=4+5+1
10=5+1+1+1+1+1
10=5+1+1+2+1
10=5+1+2+1+1
10=5+1+3+1
10=5+2+1+1+1
10=5+2+2+1
10=5+3+1+1
10=5+4+1
10=6+1+1+1+1
10=6+1+2+1
10=6+2+1+1
10=6+3+1
10=7+1+1+1
10=7+2+1
10=8+1+1
10=9+1



up 我楼上的


再次强烈BS所有把超过20行运行结果全部放上来的人!!!

我的想法
10 = 9 + 1,8 + 2,7 + 3 ...
也就是说10的算法,记作A(10)的个数=A(9) + A(8) + A(7) + ... + A(2) + A(1)
而A(9) = A(8) + A(7) + ... + A(2) + A(1)
A(8) = A(7) + ... + A(2) + A(1)
...


楼上这个显然不对


总共有42个结果
public class Main {
public static void main(String[] args) {
int count1=0;
for(int j=2;j<=10;j++){
for(int l=1;l<10/j;l++){
count1+=a(l,j,10);
}
}
System.out.println(String.valueOf(count1));
}

//这个函数里k代表起始的数字,m代表有几个数字相加,n为加起来的和
public static int a(int k,int m,int n){

int count=0;
if(k>n/m) return 0;
if(n==m)return 1;
if(m==1)return 0;

int i;
int[] num=new int[m];
for(i =0;i num[i]=n/m;
for(i=k;i<=num[0];i++){
if(m==2){
num[1]=n-i;
count++;
}
else
count=count+a(i,m-1,n-i);
}
return count;
}

}


用的递归的算法
思路大致是:
从2个数字开始加起
要保证后边的数字大于或者等于前边的数字,比如说,10=9+1,8+2,7+3,6+4,5+5
如果是10=6+4就是不对的
这个把从2个数字一直到10个数字的结果都加起来,一共42种


例如算a(1,3,10)则要计算3个数相加为10的情况。
a函数第一次循环,返回的值为a(1,2,9),为4
第二次循环,返回值为a(2,2,8),为3
第三次循环,返回a(3,2,7)为1
不一一列举了


我也写了一个,还可以再优化,不过好像10有41种,和上面兄弟的结果不一样,hehe
public int foo(int n) {
int mArray[][] = new int[n + 1][n + 1];
for (int i = 1; i <= n; i++) {
for (int j = 1; j < i; j++) {
for (int k = 1; k <= Math.min(j, i - j); k++) {
mArray[i][j] += mArray[i - j][k];
}
mArray[i][0] += mArray[i][j];
}
mArray[i][i] = 1;
}
return mArray[n][0];
}


哪位兄弟有兴趣的话,在测试一下吧,看看哪个是正确的结果


应该是41种,
public class Main {
public static void main(String[] args) {
int count1=0;
for(int j=2;j<=10;j++){
//for(int l=1;l<10/j;l++){ 这条语句没用
count1+=a(1,j,10); 这条语句改为a(1,j,10)
//}
}
System.out.println(String.valueOf(count1));
}

这个主函数里我多写了一个循环,搞错了


赫赫


楼上的,你的思路讲解一下吧,这样看太费劲


动态规划
mArray[i][j]代表和为i且加法表达式中最大数字为j的表达式数量


呵呵,我把我的程序和你的比较了一下,运行速度你的比我的快,尤其是计算数额很大的时候,比如说100
pfpf啊


我的每次都要重新计算一次,太费时间了



public class TestDG {
static int count=0;
void setCount (int num){
for(int i=1;i for(int j=1;j if(i+j==num)
count++;
}
setCount(i);
}
}
int getCount(){
return count;
}

public static void main(String[] args) {
TestDG testdg = new TestDG();
testdg.setCount(10);
System.out.println(testdg.getCount());
}
}


zhuang_zi(庄子)的算法不错,li_kewei()也好,怎么给大家加分呀?不要笑话我哦


这两天挺忙,也忘了自己的帖子了!!!


我的,用的是递归,改成迭代?
public class C2D2 {
private static int nm;
private static void addfacs( String prefix, int b, int n ) {
prefix = prefix + b + '+'; // 不需要显示的话可以去掉
for (int i=b; i<=n/2; i++)
addfacs( prefix, i, n-i );
System.out.println( prefix + n ); // 不需要显示的话可以去掉
nm++;
}

public static void main( String[] args ) {
int n = 10;
nm = 0;
for (int i=1; i<=n/2; i++)
addfacs( "", i, n-i );
System.out.println( "Total: "+nm );
}
}



100的不重复方式有190569291种。不重复是指(不同时有1+2+1和1+1+2)。
不显示中间结果的情况下,耗时3453毫秒,递归会影响速度。

--
http://www.agui.googlepages.com
mailto: agui.cn(a)gmail.com


↑返回目录
前一篇: Vectot的克隆问题
后一篇: 参加培训办是否有必要?