首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

一个比较初级的题目,有兴趣的进来看看!该如何处理

2012-02-14 
一个比较初级的题目,有兴趣的进来看看!话说读到一段程序需要判断9个数是否刚好是1------9并且不重复(顺序

一个比较初级的题目,有兴趣的进来看看!
话说读到一段程序需要判断9个数是否刚好是1------9并且不重复(顺序随便),用了下面一段程序:

if(9数之和==45 && 9数之积==9的阶乘(就是9!))
{

//这里面就是按9个数是1---9去做的处理。

}

不知道这样做有没有什么理论依据,是否正确?

换句话说,存不存在一般的结论,N个正整数的和已知,积已知,则解唯一(当然前提是解存在)?
如果结论成立,能不能给一个理论上的证明。
如果不成立,当然得找出反例喽!

[解决办法]
应该有问题,124445799
[解决办法]
写代码穷举就可以了

Java code
package com.keeya.test;public class Test {    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++){                        for(int e = 1; e < 10; e++){                            for(int f = 1; f < 10; f++){                                for(int g = 1; g < 10; g++){                                    for(int h = 1; h < 10; h++){                                        for(int i = 1; i < 10; i++){                                            if(a+b+c+d+e+f+g+h+i == 45 && a*b*c*d*e*f*g*h*i == 362880                                                    && (a==b || a==c || a==d || a==e                                                            || a==f || a==g || a==h || a==i                                                        || b==c || b==e || b==d || b==f                                                            || b== g || b==h || b==i                                                        || c==d || c==e || c==f || c==g                                                            || c==h || c==i                                                        || d==e || d==f || d==h                                                            || d==g|| d==i                                                        || e==f || e==h || e==g || e==i                                                        || f==g || f==h ||f ==i                                                        || g==h || g==i                                                        || h==i)){                                                System.out                                                        .print(a);                                                System.out                                                .print(b);                                                System.out                                                .print(c);                                                System.out                                                .print(d);                                                System.out                                                .print(e);                                                System.out                                                .print(f);                                                System.out                                                .print(g);                                                System.out                                                .print(h);                                                System.out                                                .print(i);                                                System.out.println();                                            }                                                                                    }                                    }                                }                            }                        }                    }                }            }        }    }    }
[解决办法]
呵呵,刚才没看清楚题目,粗略证明如下:
假设里面有2个数 a、b,如果有另外2个数,a+c, b+d 使得
a+b = (a+c) + (b+d)
a*b = (a+c) * (b+d)
=>
c+d = 0
c^2 = (b-a)c
=>
d = -c
c = 0 或者 c = b-a
结果就很明显了
------解决方案--------------------


我有一个算是用了语言特性的算法,用C语言实现的:

int valid( int array[], size_t size )
{
char str[10];
bzero( str, 10 );

int i;
for ( i = 0; i < 9 && array[i] >= 1 && array[i] <= 9; ++i )
{
str[i] = 'a';
}

return strlen( str ) == 9;
}

这段程序,能够实现LZ的要求。如果进一步改进的话,还可以增加参数并把程序中的常量用变量代替,来适应更广泛的要求。
[解决办法]

Java code
public class Test{    public static void main(String[] args) {        System.out.println(checkNum(123654779));        System.out.println(checkNum(123654789));        System.out.println(checkNum(123654679));    }    public static boolean checkNum(int value){        String str = String.valueOf(value);         for(int i = 1; i < 10; i++){            str = str.replaceFirst(String.valueOf(i), "0");         }        Integer temp = Integer.parseInt(str);        if(temp == 0){            return true;        }        return false;    }}
[解决办法]
如果数组所有元素的范围均在[1,32]。

C/C++ code
unsigned int msk = (1<<10) - 1;unsigned int val = 0;for(int i = 0; i < 9; i++) val |= 1<<(a[i]-1);if( val== msk ) yes;else no;
[解决办法]
全部的解

1 2 3 4 5 6 7 8 9
1 2 3 4 6 6 6 7 10
1 2 4 4 4 5 7 9 9
1 3 3 3 4 6 7 8 10
1 3 3 4 4 4 7 9 10
1 3 3 4 4 5 6 7 12
2 2 2 3 4 6 7 9 10
2 2 2 3 5 6 6 7 12
2 2 3 3 3 5 7 8 12
2 2 3 3 4 5 6 6 14
2 3 3 3 3 4 5 8 14
2 3 3 3 4 4 4 7 15

C#写的硬搜程序

using System;

namespace ConsoleApplication13
{
class Program
{
static void Main(string[] args)
{
Search(1, 9, 45, 362880, "");
}

static void Search(int currentIndex, int remain, int sRemain, int mRemain, string currentString)
{
if(remain == 0 && sRemain == 0 && mRemain == 1)
{
Console.WriteLine(currentString);
return;
}

if (remain == 0 || remain * currentIndex > sRemain)
return;

for (int i = currentIndex; i * remain <= sRemain; i++)
{
if(mRemain % i != 0)
continue;

Search(i, remain - 1, sRemain - i, mRemain / i, currentString + i + " ");
}
}
}
}

热点排行