如何按要求暴力穷举输出符合·条件的三位数
写了一下午了,还是写不出来 #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:} bin554385863 发表于 2019-11-14 20:05
-------------------------------------------------------------------------------
Microsoft Windows ...
好像还不够,得输出这种的,192 384 576,三个数的各位数都不相同 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;
}
}
} 优化什么的你可以自己想想 本帖最后由 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:} bin554385863 发表于 2019-11-14 21:54
改进版
---------------------------------------------------------------------
哥,可它不符合1,2,3倍成比例啊{:10_266:} 本帖最后由 bin554385863 于 2019-11-14 23:35 编辑
zmLau0727 发表于 2019-11-14 22:29
哥,可它不符合1,2,3倍成比例啊
你在逗我吗?{:10_249:}
你自己好好拿计算器算一算 bin554385863 发表于 2019-11-14 23:09
你在逗我吗?
你自己好好拿计算器算一算
有一说一,还是3楼那个问题;得输出这种的,192 384 576,三个数的各位数都不相同;{:10_266:}{:10_266:}{:10_266:} 跑错片场了,只能说说思路。
实际上,得到最小的一个数,就可以算出其他数,重要的条件符不符合。
取到个位的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:59 编辑
zmLau0727 发表于 2019-11-14 23:46
有一说一,还是3楼那个问题;得输出这种的,192 384 576,三个数的各位数都不相同; ...
你应该说九个数字各不相同,而不是三个数字,按你的说法,我可以理解为这每个三位数各位不相同。 #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 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 20:01 编辑
都上这儿来了……看看题解,不好吗?
我看,三连击这题,题解不少啊,理解思路不就完了吗?
莫非是刷 AC 吗? 阴阳神万物主 发表于 2019-11-15 19:52
都上这儿来了……看看题解,不好吗?
我看,三连击这题,题解不少啊,理解思路不就完了吗?
莫非是刷 AC...
有一说一,我觉得鱼c论坛的回复更亲切,然后你看12楼,我突然有灵感写出来的。没有必要刷ac zmLau0727 发表于 2019-11-15 20:56
有一说一,我觉得鱼c论坛的回复更亲切,然后你看12楼,我突然有灵感写出来的。没有必要刷ac
虽然你的代码有注释,我还是看的一脸头大{:10_266:} bin554385863 发表于 2019-11-15 21:27
虽然你的代码有注释,我还是看的一脸头大
我看你的也一样啊{:10_266:}{:10_266:}{:10_266:} zmLau0727 发表于 2019-11-15 20:56
有一说一,我觉得鱼c论坛的回复更亲切,然后你看12楼,我突然有灵感写出来的。没有必要刷ac
哦,好伐 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) #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