鱼C论坛

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

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

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

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

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

x
写了一下午了,还是写不出来
最佳答案
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-14 190721.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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>

------------------------------------------------------------------
这代码够暴力把
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

好像还不够,得输出这种的,192 384 576,三个数的各位数都不相同
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

                a1 = k / 100;
                number[a1]++;
                a2 = k % 100;
                a3 = a2 / 10;
                number[a3]++;
                a1 = a2 % 10;
                number[a1]++;
                
                for (int n = 1; n < 10; n++)
                {
                        if (number[n] != 1)
                        {
                                flag = 0;
                                continue;
                        }
                }
                if (flag)
                {
                        printf("%d %d %d\n", i, j, k);
                }
                else {
                        flag = 1;
                }
                
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-14 21:22:34 | 显示全部楼层
优化什么的你可以自己想想
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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>


这可是实打实的暴力穷举
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

哥,可它不符合1,2,3倍成比例啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


你在逗我吗?
你自己好好拿计算器算一算
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

有一说一,还是3楼那个问题;得输出这种的,192 384 576,三个数的各位数都不相同;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> 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,三个数的各位数都不相同; ...


你应该说九个数字各不相同,而不是三个数字,按你的说法,我可以理解为这每个三位数各位不相同。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-15 15:39:49 | 显示全部楼层
#include<stdio.h>
int main()
{
        int x,i,j,k,n=0,list[9]={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[i%10-1]=1;//算i的个位数字,比如是3,就让list[2]=1; 下面同理; 
                                        list[i/100-1]=1;
                                        list[(i/10)%10-1]=1;
                                        list[j%10-1]=1;
                                        list[j/100-1]=1;
                                        list[(j/10)%10-1]=1;
                                        list[k%10-1]=1;
                                        list[k/100-1]=1;
                                        list[(k/10)%10-1]=1;
                                        for(x=0;x<9;x++)
                                        {
                                                n=n+list[x];//计算list[9] 的情况 
                                                list[x]=0;//重置数组list[9],依然让整个数组全为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;
}
我想到了好一点的方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

都上这儿来了……看看题解,不好吗?
我看,三连击这题,题解不少啊,理解思路不就完了吗?
莫非是刷 AC 吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

有一说一,我觉得鱼c论坛的回复更亲切,然后你看12楼,我突然有灵感写出来的。没有必要刷ac
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

虽然你的代码有注释,我还是看的一脸头大
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我看你的也一样啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

哦,好伐
想知道小甲鱼最近在做啥?请访问 -> 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[10]={0};
        a[x/100]=1, a[x/10%10]=1, a[x%10]=1;
        a[2*x/100]=1, a[2*x/10%10]=1, a[2*x%10]=1;
        a[3*x/100]=1, a[3*x/10%10]=1, a[3*x%10]=1;
        for(int i=1;i<=9;i++)    
            n=n+a[i];
        if(n==9)    cout<<x<<" "<<2*x<<" "<<3*x<<endl;
        n=0;
    }
    return 0;
} 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 13:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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