
java算法 谁能帮我做一下这道题!
1下列乘法算式中:每个汉字代表1个数字(1~9)。相同的汉字代表相同的数字,不同的汉字代表不同的数字。赛软件*比赛=软件比拼试编程确定使得整个算式成立的数字组合。2计算2...
1 下列乘法算式中:每个汉字代表1个数字(1~9)。相同的汉字代表相同的数字,不同的汉字代表不同的数字。
赛软件 * 比赛 = 软件比拼
试编程确定使得整个算式成立的数字组合。
2 计算24是流行的扑克游戏。其方法是任意取出4张牌,A J Q K 王牌 算 1,其它牌按点数计算,花色不计。目标是通过加、减、乘、除和括号最终算出24。设计一个程序,输入4个数字(1~10),则列出所有可能计算结果为24的方案。要求:
方案不能重复(加法乘法交换律等算不同方案)。
计算中局部可以为分数,结果为整数即可(如 3 3 7 7 算法: (3 + 3/7)*7)
如果没有找到方案输出:无解。 展开
赛软件 * 比赛 = 软件比拼
试编程确定使得整个算式成立的数字组合。
2 计算24是流行的扑克游戏。其方法是任意取出4张牌,A J Q K 王牌 算 1,其它牌按点数计算,花色不计。目标是通过加、减、乘、除和括号最终算出24。设计一个程序,输入4个数字(1~10),则列出所有可能计算结果为24的方案。要求:
方案不能重复(加法乘法交换律等算不同方案)。
计算中局部可以为分数,结果为整数即可(如 3 3 7 7 算法: (3 + 3/7)*7)
如果没有找到方案输出:无解。 展开
7个回答
展开全部
我先回答第一道题:
public class HolleWorld {
public static String str = "赛软件*比赛=软件比拼";
/* 把一个数按位取出放到数组中 */
public static int[] checkNum(int num) {
int numLen = ((Integer) num).toString().length();
int temp[] = new int[numLen];
for (int i = numLen - 1; i > 0; i--) {
temp[i] = num % 10;
num = num / 10;
}
return temp;
}
public static void main(String[] args) {
int a, b, c, d, e;
boolean checkFlag = false;
for (a = 1; a <= 9; a++) {
for (b = 1; b <= 9; b++) {
for (c = 1; c <= 9; c++) {
for (d = 1; d <= 9; d++) {
for (e = 1; e <= 9; e++) {
int x = a * 100 + b * 10 + c;
int y = d * 10 + a;
int z = b * 1000 + c * 100 + d * 10 + e;
boolean flag = x * y == z;
boolean check = (checkNum(x)[0] == checkNum(y)[1])
&& (checkNum(x)[1] == checkNum(z)[0])
&& (checkNum(x)[2] == checkNum(z)[1])
&& (checkNum(y)[0] == checkNum(z)[2]);
if (flag) {
if (check) {
checkFlag = true;
System.out.println(str + " : " + x + "*"
+ y + "=" + z);
}
}
}
}
}
}
}
if (checkFlag == false) {
System.out.println("没有符合条件的组合,本题无解!");
}
}
}
我认为在保证算式成立的同时,必须最后再加上对每一位的检查!
public class HolleWorld {
public static String str = "赛软件*比赛=软件比拼";
/* 把一个数按位取出放到数组中 */
public static int[] checkNum(int num) {
int numLen = ((Integer) num).toString().length();
int temp[] = new int[numLen];
for (int i = numLen - 1; i > 0; i--) {
temp[i] = num % 10;
num = num / 10;
}
return temp;
}
public static void main(String[] args) {
int a, b, c, d, e;
boolean checkFlag = false;
for (a = 1; a <= 9; a++) {
for (b = 1; b <= 9; b++) {
for (c = 1; c <= 9; c++) {
for (d = 1; d <= 9; d++) {
for (e = 1; e <= 9; e++) {
int x = a * 100 + b * 10 + c;
int y = d * 10 + a;
int z = b * 1000 + c * 100 + d * 10 + e;
boolean flag = x * y == z;
boolean check = (checkNum(x)[0] == checkNum(y)[1])
&& (checkNum(x)[1] == checkNum(z)[0])
&& (checkNum(x)[2] == checkNum(z)[1])
&& (checkNum(y)[0] == checkNum(z)[2]);
if (flag) {
if (check) {
checkFlag = true;
System.out.println(str + " : " + x + "*"
+ y + "=" + z);
}
}
}
}
}
}
}
if (checkFlag == false) {
System.out.println("没有符合条件的组合,本题无解!");
}
}
}
我认为在保证算式成立的同时,必须最后再加上对每一位的检查!
展开全部
第一题中如果数字只能是1~9的话是无解的,下面是数字为0~9的算法,可得符合要求的数字组合为:465 * 14 = 6510;
public static void main(String[] args) {
int num1 = 0;
int num2 = 0;
int num3 = 0;
for (int n1 = 1; n1 <= 9; n1++) {
for (int n2 = 1; n2 <= 9; n2++) {
if(n2 == n1)
{
continue;
}
for (int n3 = 0; n3 <=9; n3++) {
if(n3 == n1 || n3 == n2)
{
continue;
}
num1 = n1 * 100+ n2 * 10 + n3;
for (int n4 = 1; n4 <= 9; n4++) {
if(n4 == n1 || n4==n2 || n4==n3)
{
continue;
}
num2 = n4 * 10 + n1;
for (int n5 = 0; n5 <= 9; n5++) {
if(n5==n1 || n5==n2 || n5==n3 || n5==n4)
{
continue;
}
num3 = n2*1000 + n3*100 + n4*10 + n5;
if(num1 * num2 == num3)
{
System.out.println(num1 + " * " + num2 + " = " + num3);
}
}
}
}
}
}
}
第二题可以采用上面这位兄弟的方法去实现,但实现起来比较麻烦,而且必须要考虑运行效率的问题,不然运算时间是会很长的。建议考虑以下问题:
1、将不满足条件的数字组合排除在外,如:4个数相乘小于24的组合
2、在填入括号时不要用字符串的方式填入,然后再解析表达式,可将七种方法列举出来,然后再循环计算括号中的结果。
3、在填括号时,如果三个运算符相同可不加,如果括号后的运算符只有加减也可不加。
public static void main(String[] args) {
int num1 = 0;
int num2 = 0;
int num3 = 0;
for (int n1 = 1; n1 <= 9; n1++) {
for (int n2 = 1; n2 <= 9; n2++) {
if(n2 == n1)
{
continue;
}
for (int n3 = 0; n3 <=9; n3++) {
if(n3 == n1 || n3 == n2)
{
continue;
}
num1 = n1 * 100+ n2 * 10 + n3;
for (int n4 = 1; n4 <= 9; n4++) {
if(n4 == n1 || n4==n2 || n4==n3)
{
continue;
}
num2 = n4 * 10 + n1;
for (int n5 = 0; n5 <= 9; n5++) {
if(n5==n1 || n5==n2 || n5==n3 || n5==n4)
{
continue;
}
num3 = n2*1000 + n3*100 + n4*10 + n5;
if(num1 * num2 == num3)
{
System.out.println(num1 + " * " + num2 + " = " + num3);
}
}
}
}
}
}
}
第二题可以采用上面这位兄弟的方法去实现,但实现起来比较麻烦,而且必须要考虑运行效率的问题,不然运算时间是会很长的。建议考虑以下问题:
1、将不满足条件的数字组合排除在外,如:4个数相乘小于24的组合
2、在填入括号时不要用字符串的方式填入,然后再解析表达式,可将七种方法列举出来,然后再循环计算括号中的结果。
3、在填括号时,如果三个运算符相同可不加,如果括号后的运算符只有加减也可不加。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2010-08-19
展开全部
各位高手都写得不错了,自认写得肯定没有各位好,我还是来谈谈我对各高手回答的看法吧。
第一题:
1、“tediou”兄弟的算法中没有做到“不同的汉字代表不同的数字”,输出的结果中可能含有错误结果的风险,而且每次都会在最里层的循环中重复计算3组数字,运行效率也不高。
2、赛软件 * 比赛 = 软件比拼”只是为了说明题目的意思,所以“lpdwaini258”兄弟的算法中,似乎没有必要用字符串去验证合法性,而且也每次都会在最里层的循环中重复计算3组数字,虽然能达到算法要求,但运行效率低,时间复杂度比较大。
3、我比较赞同“zengzhf”兄弟的算法,他的算法中在进入循环的开始对不合理的数字组合进行了排除,不但达到了验证的效果还提高了运行效率,而且在合适的地方对三组数字进行了计算,整个算法设计的比较合理,降低了时间复杂度。能面面俱到,应该是个比较老练的高手。
第二题:我也认为“tediou”兄弟的分析是不错,分析的比较全面,也是位算法高手,可惜没能给出具体算法。
第一题:
1、“tediou”兄弟的算法中没有做到“不同的汉字代表不同的数字”,输出的结果中可能含有错误结果的风险,而且每次都会在最里层的循环中重复计算3组数字,运行效率也不高。
2、赛软件 * 比赛 = 软件比拼”只是为了说明题目的意思,所以“lpdwaini258”兄弟的算法中,似乎没有必要用字符串去验证合法性,而且也每次都会在最里层的循环中重复计算3组数字,虽然能达到算法要求,但运行效率低,时间复杂度比较大。
3、我比较赞同“zengzhf”兄弟的算法,他的算法中在进入循环的开始对不合理的数字组合进行了排除,不但达到了验证的效果还提高了运行效率,而且在合适的地方对三组数字进行了计算,整个算法设计的比较合理,降低了时间复杂度。能面面俱到,应该是个比较老练的高手。
第二题:我也认为“tediou”兄弟的分析是不错,分析的比较全面,也是位算法高手,可惜没能给出具体算法。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1.一共五个数,把所有数做个1到10的循环。符合结果的输出。brute force
2,因为要求是所有解,所以还是brute force。
先递归把四个数的所有可能排列都列出来,然后尝试把加减乘除四个运算符填进去,再循环括号的5种可能(前两个,前三个,中间两个,最后三个,最后两个),如果括号里面是乘除法直接跳出。
2,因为要求是所有解,所以还是brute force。
先递归把四个数的所有可能排列都列出来,然后尝试把加减乘除四个运算符填进去,再循环括号的5种可能(前两个,前三个,中间两个,最后三个,最后两个),如果括号里面是乘除法直接跳出。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
第一题无解
public static void main(String[] args) {
int sai = 0,ruan = 0,jian = 0,bi = 0,pin = 0;
for (sai = 1; sai < 10; sai++) {
for (ruan = 1; ruan < 10; ruan ++) {
for (jian = 1; jian < 10; jian++) {
for (bi = 1; bi < 10; bi++) {
for (pin = 1; pin < 10; pin++) {
if ((sai * 100 + ruan *10 + jian)*(bi * 10 + sai) == ruan * 1000 + jian * 100 + bi * 10 + pin) {
System.out.println(sai+ruan+jian+"*"+bi+sai+"="+ruan+jian+bi+pin);
}
}
}
}
}
}
}
第二题
先取得4个数的所有排列:最多4!=24种情况
在将运算符填入:最多有4*4*4=64种情况
在将括号填入:
((a+b)+c)+d
(a+b)+(c+d)
(a+(b+c))+d
a+((b+c)+d)
a+(b+(c+d))
所以最多循环24*64*5=7680就可以得到结果。
public static void main(String[] args) {
int sai = 0,ruan = 0,jian = 0,bi = 0,pin = 0;
for (sai = 1; sai < 10; sai++) {
for (ruan = 1; ruan < 10; ruan ++) {
for (jian = 1; jian < 10; jian++) {
for (bi = 1; bi < 10; bi++) {
for (pin = 1; pin < 10; pin++) {
if ((sai * 100 + ruan *10 + jian)*(bi * 10 + sai) == ruan * 1000 + jian * 100 + bi * 10 + pin) {
System.out.println(sai+ruan+jian+"*"+bi+sai+"="+ruan+jian+bi+pin);
}
}
}
}
}
}
}
第二题
先取得4个数的所有排列:最多4!=24种情况
在将运算符填入:最多有4*4*4=64种情况
在将括号填入:
((a+b)+c)+d
(a+b)+(c+d)
(a+(b+c))+d
a+((b+c)+d)
a+(b+(c+d))
所以最多循环24*64*5=7680就可以得到结果。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询