zmLau0727 发表于 2019-11-14 19:09:31

如何按要求暴力穷举输出符合·条件的三位数

写了一下午了,还是写不出来

bin554385863 发表于 2019-11-14 20:05:13

#include <stdio.h>
int main(int argc, char const *argv[])
{
    for (size_t i = 100; i < 1000; i++)
    {
      for (size_t j = 100; j < 1000; j++)
      {
            for (size_t k = 100; k < 1000; k++)
            {
                if ((j == 2 * i) && (k == 3 * i))
                {
                  if (((i + j + k) % 10 != 0) && (i % 100 > 9) && (j % 100 > 9) && (k % 100 > 9))
                  {
                        printf("%d-%d-%d\n", i, j, k);
                  }
                }
            }
      }
    }
    return 0;
}

-------------------------------------------------------------------------------
Microsoft Windows [版本 10.0.18363.476]
(c) 2019 Microsoft Corporation。保留所有权利。

E:\Users\admin\Documents\VScode>c:\Users\admin\.vscode\extensions\ms-vscode.cpptools-0.26.1\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-xhqtwauz.sjg --stdout=Microsoft-MIEngine-Out-rrkqksxx.zfx --stderr=Microsoft-MIEngine-Error-qmaj2rac.sfe --pid=Microsoft-MIEngine-Pid-vlptnt1h.w0p --dbgExe=D:\MinGW\bin\gdb.exe --interpreter=mi
111-222-333
112-224-336
113-226-339
114-228-342
116-232-348
117-234-351
118-236-354
119-238-357
121-242-363
122-244-366
123-246-369
124-248-372
126-252-378
127-254-381
128-256-384
129-258-387
131-262-393
132-264-396
133-266-399
137-274-411
138-276-414
139-278-417
141-282-423
142-284-426
143-286-429
144-288-432
146-292-438
147-294-441
148-296-444
149-298-447
156-312-468
157-314-471
158-316-474
159-318-477
161-322-483
162-324-486
163-326-489
164-328-492
166-332-498
171-342-513
172-344-516
173-346-519
174-348-522
176-352-528
177-354-531
178-356-534
179-358-537
181-362-543
182-364-546
183-366-549
184-368-552
186-372-558
187-374-561
188-376-564
189-378-567
191-382-573
192-384-576
193-386-579
194-388-582
196-392-588
197-394-591
198-396-594
199-398-597
211-422-633
212-424-636
213-426-639
214-428-642
216-432-648
217-434-651
218-436-654
219-438-657
221-442-663
222-444-666
223-446-669
224-448-672
226-452-678
227-454-681
228-456-684
229-458-687
231-462-693
232-464-696
233-466-699
237-474-711
238-476-714
239-478-717
241-482-723
242-484-726
243-486-729
244-488-732
246-492-738
247-494-741
248-496-744
249-498-747
256-512-768
257-514-771
258-516-774
259-518-777
261-522-783
262-524-786
263-526-789
264-528-792
266-532-798
271-542-813
272-544-816
273-546-819
274-548-822
276-552-828
277-554-831
278-556-834
279-558-837
281-562-843
282-564-846
283-566-849
284-568-852
286-572-858
287-574-861
288-576-864
289-578-867
291-582-873
292-584-876
293-586-879
294-588-882
296-592-888
297-594-891
298-596-894
299-598-897
311-622-933
312-624-936
313-626-939
314-628-942
316-632-948
317-634-951
318-636-954
319-638-957
321-642-963
322-644-966
323-646-969
324-648-972
326-652-978
327-654-981
328-656-984
329-658-987
331-662-993
332-664-996
333-666-999

E:\Users\admin\Documents\VScode>
------------------------------------------------------------------
这代码够暴力把{:10_266:}

zmLau0727 发表于 2019-11-14 21:00:21

bin554385863 发表于 2019-11-14 20:05
-------------------------------------------------------------------------------
Microsoft Windows ...

好像还不够,得输出这种的,192 384 576,三个数的各位数都不相同

lovedai 发表于 2019-11-14 21:21:52

192 384 576
219 438 657
273 546 819#include<stdio.h>

int main()
{
        int number;
        int i,j,k,a1,a2,a3,flag=1;
        for (i = 123; i < 321; i++)
        {
                for (int n = 0; n < 10; n++)
                {
                        number = 0;
                }
                j = i * 2;
                k = i * 3;
                a1 = i / 100;
                number++;
                a2 = i % 100;
                a3 = a2 / 10;
                number++;
                a1 = a2 % 10;
                number++;

                a1 = j / 100;
                number++;
                a2 = j % 100;
                a3 = a2 / 10;
                number++;
                a1 = a2 % 10;
                number++;

                a1 = k / 100;
                number++;
                a2 = k % 100;
                a3 = a2 / 10;
                number++;
                a1 = a2 % 10;
                number++;
               
                for (int n = 1; n < 10; n++)
                {
                        if (number != 1)
                        {
                                flag = 0;
                                continue;
                        }
                }
                if (flag)
                {
                        printf("%d %d %d\n", i, j, k);
                }
                else {
                        flag = 1;
                }
               
        }
}

lovedai 发表于 2019-11-14 21:22:34

优化什么的你可以自己想想

bin554385863 发表于 2019-11-14 21:54:23

本帖最后由 bin554385863 于 2019-11-14 23:34 编辑

zmLau0727 发表于 2019-11-14 21:00
好像还不够,得输出这种的,192 384 576,三个数的各位数都不相同

改进版
#include <stdio.h>
int main(int argc, char const *argv[])
{
    for (size_t i = 100; i < 1000; i++)
    {
      for (size_t j = i; j < 1000; j++)
      {
            for (size_t k = j; k < 1000; k++)
            {
                if ((j == 2 * i) && (k == 3 * i))
                {
                  if (((i + j + k) % 10 != 0) && (i % 100 > 9) && (j % 100 > 9) && (k % 100 > 9) &&//去除中间为0的数和后两位是0的数
                        ((i / 10) % 11 != 0) && ((j / 10) % 11 != 0) && ((k / 10) % 11 != 0) &&      //去除前两位相同的数
                        ((i % 100) % 11 != 0) && ((j % 100) % 11 != 0) && ((k % 100) % 11 != 0) &&   //去除后两位相同的数
                        ((i % 10) != (i / 100)) && ((j % 10) != (j / 100)) && ((k % 10) != (k / 100))) //去除首尾相同的数
                  {
                        printf("%d-%d-%d\n", i, j, k);
                  }
                }
                break;
            }
      }
    }
    return 0;
}

---------------------------------------------------------------------
Microsoft Windows [版本 10.0.18363.476]
(c) 2019 Microsoft Corporation。保留所有权利。

E:\Users\admin\Documents\VScode>c:\Users\admin\.vscode\extensions\ms-vscode.cpptools-0.26.1\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-voekwgg1.n0a --stdout=Microsoft-MIEngine-Out-nh3ihmpu.fge --stderr=Microsoft-MIEngine-Error-tlakqtck.bpf --pid=Microsoft-MIEngine-Pid-2fhokhww.1lt --dbgExe=D:\MinGW\bin\gdb.exe --interpreter=mi
123-246-369
124-248-372
127-254-381
128-256-384
129-258-387
132-264-396
139-278-417
142-284-426
143-286-429
156-312-468
157-314-471
162-324-486
163-326-489
164-328-492
173-346-519
176-352-528
178-356-534
179-358-537
182-364-546
187-374-561
189-378-567
192-384-576
193-386-579
197-394-591
198-396-594
213-426-639
214-428-642
216-432-648
218-436-654
219-438-657
231-462-693
238-476-714
241-482-723
243-486-729
246-492-738
256-512-768
263-526-789
264-528-792
271-542-813
273-546-819
281-562-843
284-568-852
287-574-861
289-578-867
291-582-873
293-586-879
297-594-891
298-596-894
312-624-936
314-628-942
316-632-948
317-634-951
319-638-957
321-642-963
324-648-972
326-652-978
327-654-981
329-658-987

E:\Users\admin\Documents\VScode>

这可是实打实的暴力穷举{:10_266:}

zmLau0727 发表于 2019-11-14 22:29:11

bin554385863 发表于 2019-11-14 21:54
改进版

---------------------------------------------------------------------


哥,可它不符合1,2,3倍成比例啊{:10_266:}

bin554385863 发表于 2019-11-14 23:09:48

本帖最后由 bin554385863 于 2019-11-14 23:35 编辑

zmLau0727 发表于 2019-11-14 22:29
哥,可它不符合1,2,3倍成比例啊

你在逗我吗?{:10_249:}
你自己好好拿计算器算一算

zmLau0727 发表于 2019-11-14 23:46:32

bin554385863 发表于 2019-11-14 23:09
你在逗我吗?
你自己好好拿计算器算一算

有一说一,还是3楼那个问题;得输出这种的,192 384 576,三个数的各位数都不相同;{:10_266:}{:10_266:}{:10_266:}

Stubborn 发表于 2019-11-15 03:23:03

跑错片场了,只能说说思路。
实际上,得到最小的一个数,就可以算出其他数,重要的条件符不符合。
取到个位的1-9循环,和十位的1-9循环,和百位的1-3循环(*3不超过1000)
关于如何去掉不合符条件的,想想版本,很多

192 384 576
273 546 819
327 654 981
219 438 657

bin554385863 发表于 2019-11-15 08:05:57

本帖最后由 bin554385863 于 2019-11-15 08:59 编辑

zmLau0727 发表于 2019-11-14 23:46
有一说一,还是3楼那个问题;得输出这种的,192 384 576,三个数的各位数都不相同; ...

你应该说九个数字各不相同,而不是三个数字,按你的说法,我可以理解为这每个三位数各位不相同。

zmLau0727 发表于 2019-11-15 15:39:49

#include<stdio.h>
int main()
{
        int x,i,j,k,n=0,list={0};//定义一个9个数的数组,全是0;
       
        for(i=123;i<334;i++)
        {
                if((i/10)%10==0) continue; //十位为0就跳到下一次循环;
               
                for(j=100;j<1000;j++)
                {
                        if((j/10)%10==0) continue;//十位为0就跳到下一次循环;
                       
                        for(k=100;k<1000;k++)
                        {
                                if((k/10)%10==0) continue;//十位为0就跳到下一次循环;
                                if((j==2*i&&k==3*i)&&i%10!=0)//保证1,2,3倍关系,且个位都不为0;
                                {
                                        list=1;//算i的个位数字,比如是3,就让list=1; 下面同理;
                                        list=1;
                                        list[(i/10)%10-1]=1;
                                        list=1;
                                        list=1;
                                        list[(j/10)%10-1]=1;
                                        list=1;
                                        list=1;
                                        list[(k/10)%10-1]=1;
                                        for(x=0;x<9;x++)
                                        {
                                                n=n+list;//计算list 的情况
                                                list=0;//重置数组list,依然让整个数组全为0;
                                        }
                                        if(n==9)//如果n=9,说明被全部替换成了1,即3个数的各位数都不相等;打印出i,j,k的值;
                                        {
                                                printf("%d %d %d\n",i,j,k);
                                        }

                                        else//如果3个数的各位数有相等的情况,n<9,那就让n=0,重新开始下一次循环;
                                        {
                                                n=0;
                                        }
                                }
                               
                        }
                }
               
        }
        return 0;
}
我想到了好一点的方法{:10_266:}{:10_266:}{:10_266:}

bin554385863 发表于 2019-11-15 18:42:19

本帖最后由 bin554385863 于 2019-11-15 21:24 编辑

#include <stdio.h>
#include <stdbool.h>
bool cmp(int n, int m) //判断两个三位数是否含有相同的数字
{
    bool flag = true;
    int a = n / 100, i = m / 100, b = (n % 100) / 10, j = (m % 100) / 10, c = n % 10, k = m % 10;
    if (a != j && a != i && a != k && b != i && b != j && b != k && c != i && c != j && c != k)
    {
      flag = false;
    }
    return flag;
}
bool cmp123(int x, int y, int z) //判断是三个三位数是否符合比例
{
    bool flag = false;
    if ((y == 2 * x) && (z == 3 * x))
    {
      flag = true;
    }
    return flag;
}
bool islastzero(int x, int y, int z) //判断三个三位数是否含有零
{
    bool flag = true;
    if ((x + y + z) % 10 != 0 && (x % 100 > 9) && (y % 100 > 9) && (z % 100 > 9))
    {
      flag = false;
    }
    return flag;
}
bool issamedigit(int n) //判断三位数是否含有相同的数字
{
    bool flag = true;
    if ((n % 10 != n / 100) && (n % 10 != (n % 100) / 10) && (n / 100 != (n % 100) / 10))
    {
      flag = false;
    }
    return flag;
}
int main(int argc, char const *argv[])
{
    for (size_t i = 123; i < 330; i++)
    {
      int j = 2 * i, k = 3 * i;
      if (!cmp(i, j) && !cmp(i, k) && !cmp(j, k) && cmp123(i, j, k) && !islastzero(i, j, k) && !issamedigit(i) && !issamedigit(j) && !issamedigit(k))
      {
            printf("%d %d %d\n", i, j, k);
      }
    }
    return 0;
}

--------------------------------------------------------------------------------------------------------------------
Microsoft Windows [版本 10.0.18363.476]
(c) 2019 Microsoft Corporation。保留所有权利。

E:\Users\admin\Documents\VScode>c:\Users\admin\.vscode\extensions\ms-vscode.cpptools-0.26.1\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-qk5vc2ft.zde --stdout=Microsoft-MIEngine-Out-h2nkam1g.glu --stderr=Microsoft-MIEngine-Error-nov1z25b.xmv --pid=Microsoft-MIEngine-Pid-4bed5xua.geb --dbgExe=D:\MinGW\bin\gdb.exe --interpreter=mi
192 384 576
219 438 657
273 546 819
327 654 981

E:\Users\admin\Documents\VScode>

阴阳神万物主 发表于 2019-11-15 19:52:29

本帖最后由 阴阳神万物主 于 2019-11-15 20:01 编辑

都上这儿来了……看看题解,不好吗?
我看,三连击这题,题解不少啊,理解思路不就完了吗?
莫非是刷 AC 吗?

zmLau0727 发表于 2019-11-15 20:56:15

阴阳神万物主 发表于 2019-11-15 19:52
都上这儿来了……看看题解,不好吗?
我看,三连击这题,题解不少啊,理解思路不就完了吗?
莫非是刷 AC...

有一说一,我觉得鱼c论坛的回复更亲切,然后你看12楼,我突然有灵感写出来的。没有必要刷ac

bin554385863 发表于 2019-11-15 21:27:43

zmLau0727 发表于 2019-11-15 20:56
有一说一,我觉得鱼c论坛的回复更亲切,然后你看12楼,我突然有灵感写出来的。没有必要刷ac

虽然你的代码有注释,我还是看的一脸头大{:10_266:}

zmLau0727 发表于 2019-11-15 21:48:54

bin554385863 发表于 2019-11-15 21:27
虽然你的代码有注释,我还是看的一脸头大

我看你的也一样啊{:10_266:}{:10_266:}{:10_266:}

阴阳神万物主 发表于 2019-11-15 21:51:32

zmLau0727 发表于 2019-11-15 20:56
有一说一,我觉得鱼c论坛的回复更亲切,然后你看12楼,我突然有灵感写出来的。没有必要刷ac

哦,好伐

噜啦啦啦啦 发表于 2019-11-17 12:55:59

import itertools
data=[]
answer=[]
gg=[]
for i in itertools.permutations('123456789',3):
    data.append("".join(i))

   
for i in data:
    for j in data:
      if int(i)*2==int(j):
            for q in data:
                if int(i)*3==int(q):
                  answer.append(i+j+q)
for i in answer:
    w="".join(set(i))
    if len(w)==9:
      gg.append(i)
print(gg)

ten$1 发表于 2019-11-17 17:08:18

#include<iostream>
using namespace std;
int main()
{
    int n=0;
    for(int x=123;x<=329;x++){
      int a={0};
      a=1, a=1, a=1;
      a=1, a=1, a=1;
      a=1, a=1, a=1;
      for(int i=1;i<=9;i++)   
            n=n+a;
      if(n==9)    cout<<x<<" "<<2*x<<" "<<3*x<<endl;
      n=0;
    }
    return 0;
}
页: [1] 2
查看完整版本: 如何按要求暴力穷举输出符合·条件的三位数