鱼C论坛

 找回密码
 立即注册
查看: 2826|回复: 20

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

[复制链接]
发表于 2019-11-14 19:09:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
写了一下午了,还是写不出来
最佳答案
2019-11-15 18:42:19
本帖最后由 bin554385863 于 2019-11-15 21:24 编辑
  1. #include <stdio.h>
  2. #include <stdbool.h>
  3. bool cmp(int n, int m) //判断两个三位数是否含有相同的数字
  4. {
  5.     bool flag = true;
  6.     int a = n / 100, i = m / 100, b = (n % 100) / 10, j = (m % 100) / 10, c = n % 10, k = m % 10;
  7.     if (a != j && a != i && a != k && b != i && b != j && b != k && c != i && c != j && c != k)
  8.     {
  9.         flag = false;
  10.     }
  11.     return flag;
  12. }
  13. bool cmp123(int x, int y, int z) //判断是三个三位数是否符合比例
  14. {
  15.     bool flag = false;
  16.     if ((y == 2 * x) && (z == 3 * x))
  17.     {
  18.         flag = true;
  19.     }
  20.     return flag;
  21. }
  22. bool islastzero(int x, int y, int z) //判断三个三位数是否含有零
  23. {
  24.     bool flag = true;
  25.     if ((x + y + z) % 10 != 0 && (x % 100 > 9) && (y % 100 > 9) && (z % 100 > 9))
  26.     {
  27.         flag = false;
  28.     }
  29.     return flag;
  30. }
  31. bool issamedigit(int n) //判断三位数是否含有相同的数字
  32. {
  33.     bool flag = true;
  34.     if ((n % 10 != n / 100) && (n % 10 != (n % 100) / 10) && (n / 100 != (n % 100) / 10))
  35.     {
  36.         flag = false;
  37.     }
  38.     return flag;
  39. }
  40. int main(int argc, char const *argv[])
  41. {
  42.     for (size_t i = 123; i < 330; i++)
  43.     {
  44.         int j = 2 * i, k = 3 * i;
  45.         if (!cmp(i, j) && !cmp(i, k) && !cmp(j, k) && cmp123(i, j, k) && !islastzero(i, j, k) && !issamedigit(i) && !issamedigit(j) && !issamedigit(k))
  46.         {
  47.             printf("%d %d %d\n", i, j, k);
  48.         }
  49.     }
  50.     return 0;
  51. }
复制代码

--------------------------------------------------------------------------------------------------------------------
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-14 190721.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-11-14 20:05:13 | 显示全部楼层
  1. #include <stdio.h>
  2. int main(int argc, char const *argv[])
  3. {
  4.     for (size_t i = 100; i < 1000; i++)
  5.     {
  6.         for (size_t j = 100; j < 1000; j++)
  7.         {
  8.             for (size_t k = 100; k < 1000; k++)
  9.             {
  10.                 if ((j == 2 * i) && (k == 3 * i))
  11.                 {
  12.                     if (((i + j + k) % 10 != 0) && (i % 100 > 9) && (j % 100 > 9) && (k % 100 > 9))
  13.                     {
  14.                         printf("%d-%d-%d\n", i, j, k);
  15.                     }
  16.                 }
  17.             }
  18.         }
  19.     }
  20.     return 0;
  21. }
复制代码

-------------------------------------------------------------------------------
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>

------------------------------------------------------------------
这代码够暴力把
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-14 21:00:21 | 显示全部楼层
bin554385863 发表于 2019-11-14 20:05
-------------------------------------------------------------------------------
Microsoft Windows ...

好像还不够,得输出这种的,192 384 576,三个数的各位数都不相同
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-14 21:21:52 | 显示全部楼层
192 384 576
219 438 657
273 546 819
  1. #include<stdio.h>

  2. int main()
  3. {
  4.         int number[10];
  5.         int i,j,k,a1,a2,a3,flag=1;
  6.         for (i = 123; i < 321; i++)
  7.         {
  8.                 for (int n = 0; n < 10; n++)
  9.                 {
  10.                         number[n] = 0;
  11.                 }
  12.                 j = i * 2;
  13.                 k = i * 3;
  14.                 a1 = i / 100;
  15.                 number[a1]++;
  16.                 a2 = i % 100;
  17.                 a3 = a2 / 10;
  18.                 number[a3]++;
  19.                 a1 = a2 % 10;
  20.                 number[a1]++;

  21.                 a1 = j / 100;
  22.                 number[a1]++;
  23.                 a2 = j % 100;
  24.                 a3 = a2 / 10;
  25.                 number[a3]++;
  26.                 a1 = a2 % 10;
  27.                 number[a1]++;

  28.                 a1 = k / 100;
  29.                 number[a1]++;
  30.                 a2 = k % 100;
  31.                 a3 = a2 / 10;
  32.                 number[a3]++;
  33.                 a1 = a2 % 10;
  34.                 number[a1]++;
  35.                
  36.                 for (int n = 1; n < 10; n++)
  37.                 {
  38.                         if (number[n] != 1)
  39.                         {
  40.                                 flag = 0;
  41.                                 continue;
  42.                         }
  43.                 }
  44.                 if (flag)
  45.                 {
  46.                         printf("%d %d %d\n", i, j, k);
  47.                 }
  48.                 else {
  49.                         flag = 1;
  50.                 }
  51.                
  52.         }
  53. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-14 21:22:34 | 显示全部楼层
优化什么的你可以自己想想
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-14 21:54:23 | 显示全部楼层
本帖最后由 bin554385863 于 2019-11-14 23:34 编辑
zmLau0727 发表于 2019-11-14 21:00
好像还不够,得输出这种的,192 384 576,三个数的各位数都不相同


改进版
  1. #include <stdio.h>
  2. int main(int argc, char const *argv[])
  3. {
  4.     for (size_t i = 100; i < 1000; i++)
  5.     {
  6.         for (size_t j = i; j < 1000; j++)
  7.         {
  8.             for (size_t k = j; k < 1000; k++)
  9.             {
  10.                 if ((j == 2 * i) && (k == 3 * i))
  11.                 {
  12.                     if (((i + j + k) % 10 != 0) && (i % 100 > 9) && (j % 100 > 9) && (k % 100 > 9) &&  //去除中间为0的数和后两位是0的数
  13.                         ((i / 10) % 11 != 0) && ((j / 10) % 11 != 0) && ((k / 10) % 11 != 0) &&        //去除前两位相同的数
  14.                         ((i % 100) % 11 != 0) && ((j % 100) % 11 != 0) && ((k % 100) % 11 != 0) &&     //去除后两位相同的数
  15.                         ((i % 10) != (i / 100)) && ((j % 10) != (j / 100)) && ((k % 10) != (k / 100))) //去除首尾相同的数
  16.                     {
  17.                         printf("%d-%d-%d\n", i, j, k);
  18.                     }
  19.                 }
  20.                 break;
  21.             }
  22.         }
  23.     }
  24.     return 0;
  25. }
复制代码

---------------------------------------------------------------------
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>


这可是实打实的暴力穷举
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-14 22:29:11 | 显示全部楼层
bin554385863 发表于 2019-11-14 21:54
改进版

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

哥,可它不符合1,2,3倍成比例啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-14 23:09:48 | 显示全部楼层
本帖最后由 bin554385863 于 2019-11-14 23:35 编辑
zmLau0727 发表于 2019-11-14 22:29
哥,可它不符合1,2,3倍成比例啊


你在逗我吗?
你自己好好拿计算器算一算
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-14 23:46:32 | 显示全部楼层
bin554385863 发表于 2019-11-14 23:09
你在逗我吗?
你自己好好拿计算器算一算

有一说一,还是3楼那个问题;得输出这种的,192 384 576,三个数的各位数都不相同;
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  1. 192 384 576
  2. 273 546 819
  3. 327 654 981
  4. 219 438 657
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-15 08:05:57 From FishC Mobile | 显示全部楼层
本帖最后由 bin554385863 于 2019-11-15 08:59 编辑
zmLau0727 发表于 2019-11-14 23:46
有一说一,还是3楼那个问题;得输出这种的,192 384 576,三个数的各位数都不相同; ...


你应该说九个数字各不相同,而不是三个数字,按你的说法,我可以理解为这每个三位数各位不相同。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-15 15:39:49 | 显示全部楼层
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         int x,i,j,k,n=0,list[9]={0};//定义一个9个数的数组,全是0;
  5.        
  6.         for(i=123;i<334;i++)
  7.         {
  8.                 if((i/10)%10==0) continue; //十位为0就跳到下一次循环;
  9.                
  10.                 for(j=100;j<1000;j++)
  11.                 {
  12.                         if((j/10)%10==0) continue;//十位为0就跳到下一次循环;
  13.                        
  14.                         for(k=100;k<1000;k++)
  15.                         {
  16.                                 if((k/10)%10==0) continue;//十位为0就跳到下一次循环;
  17.                                 if((j==2*i&&k==3*i)&&i%10!=0)//保证1,2,3倍关系,且个位都不为0;
  18.                                 {
  19.                                         list[i%10-1]=1;//算i的个位数字,比如是3,就让list[2]=1; 下面同理;
  20.                                         list[i/100-1]=1;
  21.                                         list[(i/10)%10-1]=1;
  22.                                         list[j%10-1]=1;
  23.                                         list[j/100-1]=1;
  24.                                         list[(j/10)%10-1]=1;
  25.                                         list[k%10-1]=1;
  26.                                         list[k/100-1]=1;
  27.                                         list[(k/10)%10-1]=1;
  28.                                         for(x=0;x<9;x++)
  29.                                         {
  30.                                                 n=n+list[x];//计算list[9] 的情况
  31.                                                 list[x]=0;//重置数组list[9],依然让整个数组全为0;
  32.                                         }
  33.                                         if(n==9)//如果n=9,说明被全部替换成了1,即3个数的各位数都不相等;打印出i,j,k的值;
  34.                                         {
  35.                                                 printf("%d %d %d\n",i,j,k);
  36.                                         }

  37.                                         else//如果3个数的各位数有相等的情况,n<9,那就让n=0,重新开始下一次循环;
  38.                                         {
  39.                                                 n=0;
  40.                                         }
  41.                                 }
  42.                                
  43.                         }
  44.                 }
  45.                
  46.         }
  47.         return 0;
  48. }
复制代码

我想到了好一点的方法
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-15 18:42:19 | 显示全部楼层    本楼为最佳答案   
本帖最后由 bin554385863 于 2019-11-15 21:24 编辑
  1. #include <stdio.h>
  2. #include <stdbool.h>
  3. bool cmp(int n, int m) //判断两个三位数是否含有相同的数字
  4. {
  5.     bool flag = true;
  6.     int a = n / 100, i = m / 100, b = (n % 100) / 10, j = (m % 100) / 10, c = n % 10, k = m % 10;
  7.     if (a != j && a != i && a != k && b != i && b != j && b != k && c != i && c != j && c != k)
  8.     {
  9.         flag = false;
  10.     }
  11.     return flag;
  12. }
  13. bool cmp123(int x, int y, int z) //判断是三个三位数是否符合比例
  14. {
  15.     bool flag = false;
  16.     if ((y == 2 * x) && (z == 3 * x))
  17.     {
  18.         flag = true;
  19.     }
  20.     return flag;
  21. }
  22. bool islastzero(int x, int y, int z) //判断三个三位数是否含有零
  23. {
  24.     bool flag = true;
  25.     if ((x + y + z) % 10 != 0 && (x % 100 > 9) && (y % 100 > 9) && (z % 100 > 9))
  26.     {
  27.         flag = false;
  28.     }
  29.     return flag;
  30. }
  31. bool issamedigit(int n) //判断三位数是否含有相同的数字
  32. {
  33.     bool flag = true;
  34.     if ((n % 10 != n / 100) && (n % 10 != (n % 100) / 10) && (n / 100 != (n % 100) / 10))
  35.     {
  36.         flag = false;
  37.     }
  38.     return flag;
  39. }
  40. int main(int argc, char const *argv[])
  41. {
  42.     for (size_t i = 123; i < 330; i++)
  43.     {
  44.         int j = 2 * i, k = 3 * i;
  45.         if (!cmp(i, j) && !cmp(i, k) && !cmp(j, k) && cmp123(i, j, k) && !islastzero(i, j, k) && !issamedigit(i) && !issamedigit(j) && !issamedigit(k))
  46.         {
  47.             printf("%d %d %d\n", i, j, k);
  48.         }
  49.     }
  50.     return 0;
  51. }
复制代码

--------------------------------------------------------------------------------------------------------------------
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>
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-15 19:52:29 | 显示全部楼层
本帖最后由 阴阳神万物主 于 2019-11-15 20:01 编辑

都上这儿来了……看看题解,不好吗?
我看,三连击这题,题解不少啊,理解思路不就完了吗?
莫非是刷 AC 吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

有一说一,我觉得鱼c论坛的回复更亲切,然后你看12楼,我突然有灵感写出来的。没有必要刷ac
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

虽然你的代码有注释,我还是看的一脸头大
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-15 21:48:54 | 显示全部楼层
bin554385863 发表于 2019-11-15 21:27
虽然你的代码有注释,我还是看的一脸头大

我看你的也一样啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

哦,好伐
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-17 17:08:18 | 显示全部楼层
  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5.     int n=0;
  6.     for(int x=123;x<=329;x++){
  7.         int a[10]={0};
  8.         a[x/100]=1, a[x/10%10]=1, a[x%10]=1;
  9.         a[2*x/100]=1, a[2*x/10%10]=1, a[2*x%10]=1;
  10.         a[3*x/100]=1, a[3*x/10%10]=1, a[3*x%10]=1;
  11.         for(int i=1;i<=9;i++)   
  12.             n=n+a[i];
  13.         if(n==9)    cout<<x<<" "<<2*x<<" "<<3*x<<endl;
  14.         n=0;
  15.     }
  16.     return 0;
  17. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-12 21:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表