题目背景
本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。
题目描述
将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;
}