洛谷 P1008 三连击 题解

2019-02-23  本文已影响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;
}
上一篇 下一篇

猜你喜欢

热点阅读