美文网首页
洛谷 P1008 三连击 题解

洛谷 P1008 三连击 题解

作者: 楠子小先生 | 来源:发表于2019-02-23 10:22 被阅读0次

题目背景

本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。

题目描述

将1,2, … ,9共9个数分成3组,分别组成3个三位数,且使这3个三位数构成1:2:3的比例,试求出所有满足条件的3个三位数。

输入输出格式

输入格式:

木有输入

输出格式:

若干行,每行3个数字。按照每行第1个数字升序排列。

思路
1-9组成的三位数,最小123,最大987,因此估算第一个三位数的范围为123-987。因为满足1:2:3的比例,第二、第三个三位数可由倍数关系求得。然后用除法和取余的方法求出三个三位数的各位数字,比较是否在1-9内,是否重复。

初代码(有误)
#include <iostream>
using namespace std;

int main(){
    int i=0,m=0,n=0,flag=0;//i第一个数,m第二个,n第三个 
    int a[9]={0};
    for(i=123;i<=329;i++){
        m=i*2;
        n=i*3;
        a[0]=i/100;
        a[1]=i%100/10;
        a[2]=i%10;
        a[3]=m/100;
        a[4]=m%100/10;
        a[5]=m%10;
        a[6]=n/100;
        a[7]=n%100/10;
        a[8]=n%10;

        for(int p=0;p<8;p++){
            for(int q=p+1;q<9;q++){
                
                if(a[p]==a[q])  flag=1;
            }
        }
        if(flag==0) {
            cout<<i<<" "<<m<<" "<<n<<endl;
        }
    }
    return 0;
}

踩坑

1,未输出任何答案

原因:跳出最大的for循环前flag未设为0,导致第一遍大循环后flag永为1。
解决办法:跳出循环前加入代码

if(flag==1) flag=0; 
2,WA

正确输出应为:

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

而由1修改后的代码输出:

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

原因:多出答案267 534 801,含0,不在1-9内。
解决方法:加入检验0的语句

if(a[p]==0||a[q]==0) flag=1;

最终代码:

#include <iostream>
using namespace std;

int main(){
    int i=0,m=0,n=0,flag=0;//i第一个数,m第二个,n第三个 
    int a[9]={0};
    for(i=123;i<=329;i++){
        m=i*2;
        n=i*3;
        a[0]=i/100;
        a[1]=i%100/10;
        a[2]=i%10;
        a[3]=m/100;
        a[4]=m%100/10;
        a[5]=m%10;
        a[6]=n/100;
        a[7]=n%100/10;
        a[8]=n%10;

        for(int p=0;p<8;p++){
            for(int q=p+1;q<9;q++){
                if(a[p]==0||a[q]==0) flag=1;
                if(a[p]==a[q])  flag=1;
            }
        }
        if(flag==0) {
            cout<<i<<" "<<m<<" "<<n<<endl;
        }
        if(flag==1) flag=0; 
    }
    return 0;
}

相关文章

  • 洛谷 P1008 三连击 题解

    题目背景 本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。 题目描...

  • 2018-11-02洛谷P1008三连击题解

    我的想法是让三组数分别等于a,b,c,又因为三组数要有1:2:3的关系,所以直接令b=2a,c=3a,接下来在检测...

  • P1000 超级玛丽游戏

    【题目背景】 本题是洛谷的试机题目,可以帮助了解洛谷的使用。 建议完成本题目后继续尝试P1001、P1008。 【...

  • 洛谷水题感悟-P1008 三连击

    这是一道水题,但给人非常大的感悟和启发,思维瞬间上升到哲学层面。在我们的生活中,正向和逆向思维对于解决一个问题具有...

  • P1008 三连击

    题目描述:将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2:3的比例,试求出所有满...

  • [Java] 洛谷 P1008. 三连击

    Description 将1,2, ,9,共9个数分成3组,分别组成3个三位数,且使这3个三位数构成1:2:3的...

  • 洛谷P1025题解

    题目链接:洛谷P1025 题目描述 将整数分成份,且每份不能为空,任意两个方案不相同(不考虑顺序)。 例如:,下面...

  • 洛谷P1002题解

    少儿编程咨询、算法咨询请加微信307591841或QQ群581357582诺依曼算法公众号.jpg

  • 2018 CCF NOIP Junior 题解

    2018 CCF NOIP Junior 题解 标题统计 洛谷自测 P5015 牛客网自测 277A 给定一个字符...

  • 洛谷P1141 01迷宫 题解

    一条搜索水题,竟然交了10次才a...还是太菜了,怒献一篇题解,思路是记忆化dfs+剪枝。先看一下题目:(截图拼接...

网友评论

      本文标题:洛谷 P1008 三连击 题解

      本文链接:https://www.haomeiwen.com/subject/pcvuyqtx.html