java - C语言的一道关于循环的练习题求解
ringa_lee
ringa_lee 2017-04-18 10:56:30
[Java讨论组]


做这道题目没什么思路?不知道该怎么下手,求大神讲解一下

ringa_lee
ringa_lee

ringa_lee

全部回复(6)
大家讲道理

http://blog.csdn.net/houyp520...

阿神

最简单的话就是穷举9个数的排列。

优化一点就是先排除一些不可能的情况。比如中间的数是2的倍数,最后的数是3的倍数。诸如此类。

ringa_lee

写个递归好了。。或者叫迭代?

高洛峰

public class Sidney {

public static void main(String[] args) {
    int[] s = new int[9];
    for (int i = 300; i < 999; i+=3) {
        int flag = 1;
        Set<Integer> set = new HashSet<>();
        int a = i / 3;
        int b = (i / 3) * 2;
        s[0]=a%10;s[1]=a%100/10;s[2]=a/100;
        s[3]=b%10;s[4]=b%100/10;s[5]=b/100;
        s[6]=i%10;s[7]=i%100/10;s[8]=i/100;
        for (int i1 : s) {
            if (!set.add(i1) || i1 == 0) {
                flag = 0;
                break;
            }
        }
        if (flag == 1) {
            System.out.println(a + "\t" + b + "\t" + i);
        }
    }
}

}

迷茫

刘汝佳的题啊。

枚举第一个数, 也就是1:2:3中占比1的那个数。

枚举范围是123~345。根据这个数,去计算其他两个数,然后判定是否恰好用了9个数字即可。

大家讲道理

思路很简单,既然要让比例为1:2:3且每个数要用一次,那就直接将1,2,3各放大x倍,然后判断是否满足每个数仅出现一次即可。1只少放大100倍才能达到3位数,所以直接从123开始即可。代码如下。
int testa()
{

int a=1,b=2,c =3;
char szA[10]={0},szB[4]={0},szC[4]={0},cTag[10]={0};

for(int i=123;i<=333;i++)
{
    memset(szA,0x00,10);memset(szB,0x00,4);memset(szC,0x00,4);memset(cTag,0x00,10);
    sprintf_s(szA,"%d",a*i);sprintf_s(szB,"%d",b*i);sprintf_s(szC,"%d",c*i);

    strcat_s(szA,szB);strcat_s(szA,szC);
    int j=0;
    for(j=0;j<9;j++)
    {
        if(cTag[szA[j]-'1']!=0)
            break;
        cTag[szA[j]-'1']=1;
    }

    if(j==9)
        printf("%s\n",szA);
}

return 0;

}

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号