kittenpuppy 发表于 2021-3-27 22:07:05

请教解决问题的思路

虽然断断续续一直在学,但是总是不得要领。最近碰到一些关于数字的题目,屡见屡败,根本不知道怎么解决,被打击得自信心降至负值。
举例:编写一个程序,将1,2,3,……,9,共9个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2:3的比例,例如:192、384、576就是这样的一组三位数。试求出所有满足条件的三个三位数。这个题中,我不知道怎样表示这三个数?
再举一例,有2,3,4,5,6,7六个数字,组合成2个三位数,使它们的乘积最大。如何表示乘积最大?
这种题统统不知道如何下手,真是让人欲哭无泪。
请教大神们,这种题如何思考?如何下手?谢谢先!

kittenpuppy 发表于 2021-3-27 22:36:00

请路过的大神们帮帮忙,帮我解决我举的两个例子吧!拜谢!

13561229223 发表于 2021-3-27 22:38:25

for(i = 1; i<10; i++){
    for(j = 1; j<10; j++){
      for(k = 1; k<10; k++){
            number = i*100+j*10+k
      }
    }
}

13561229223 发表于 2021-3-27 22:54:18

肯定是777*777最大了。你这问题应该是没表述清楚吧?

qq1151985918 发表于 2021-3-27 23:46:38

就像你说的,给你举个栗子,但是不给你注释了,如果对照代码你能看明白或许可以举一反三
这种题目并不是只有一种算法,其他的方式或许比我这个更简洁更易懂等待你发掘
这题目我第一题第二题本来可以用一样的思路来写,但我用了两种思路,或许能给你更多启发
废话不多讲,直接上代码
# 题目1
nums = range(100,1000)
for num in nums:
    if num*3 in nums:
      allnum = list(str(num))+list(str(num*2))+list(str(num*3))
      if "0" in allnum:
            continue
      if len(set(allnum)) == 9:
            print(num,num*2,num*3)
    else:
      break

# 题目2
nums = []
data = sorted(list("234567"))
for num1 in range(234,766):
    for num2 in range(234,766):
      allnum = sorted(list(str(num1))+list(str(num2)))
      if allnum == data:
            nums.append()
res = sorted(nums, key = lambda x:x[-1])
print(res[-1])

13561229223 发表于 2021-3-27 23:59:23

第二个问题 结果是:485179 = 743 * 653
#include <stdio.h>
int main()
{
        int num1,num2,i,j,k,a,b,c,max_a,max_b;
        int max = 0;
       
        for(i = 2; i<8; i++){
                for(j = 2; j<8; j++){
                        for(k = 2; k<8; k++){
                                if(i==j||j==k||i==k)
                                        continue;
                                num1 = i*100+j*10+k;
                                for(a = 2; a<8; a++){
                                        for(b = 2; b<8; b++){
                                                for(c = 2; c<8; c++){
                                                        if(a==b||a==c||b==c||a==i||a==j||a==k||b==i||b==j||b==k
                                                          ||c==i||c==j||c==k)
                                                                continue;
                                                        num2 = a*100+b*10+k;
                                                        if(max <= num1 * num2)
                                                        {
                                                                max = num1 * num2;
                                                                max_a = num1;
                                                                max_b = num2;
                                                        }
                                                }
                                        }
                                }
                        }
                }
        }
printf("%d = %d * %d\n",max,max_a,max_b);
          
   return 0;
}

kittenpuppy 发表于 2021-3-28 08:32:01

13561229223 发表于 2021-3-27 23:59
第二个问题 结果是:485179 = 743 * 653

感谢大神

kittenpuppy 发表于 2021-3-28 08:32:34

qq1151985918 发表于 2021-3-27 23:46
就像你说的,给你举个栗子,但是不给你注释了,如果对照代码你能看明白或许可以举一反三
这种题目并不是只 ...

感谢大神,我要慢慢消化

qq1151985918 发表于 2021-3-28 09:09:41

kittenpuppy 发表于 2021-3-28 08:32
感谢大神,我要慢慢消化

有看不懂的可以继续问我,我看到后会给你回复。

就像本题中的题目二,我用了另外的算法,事实证明,如果题目二用跟题目一一样的算法,效率可以提高17倍

用题目一的算法写题目二 需要 0.023 秒,而代码中的题目二足足用了 0.402秒,相差17.47倍,希望你能用题目一的算法写出题目二
页: [1]
查看完整版本: 请教解决问题的思路