题目描述
将1,2,⋯,9共9个数分成3组,分别组成3个三位数,且使这3个三位数构成1:2:3的比例,试求出所有满足条件的3个三位数。
输入输出格式
输入格式:
木有输入
输出格式:
若干行,每行3个数字。按照每行第1个数字升序排列。
输入输出样例
输入样例:
无
输出样例:
192 384 576
#include<stdio.h>
#include<string.h>
int a[10];
int main(){
for (int x=123;x<=329;x++){ //枚举
int i=x,j=x*2,k=x*3;
int o=i,p=j,q=k;
int flag=0; //清零
memset(a,0,sizeof(a));
while(i>0){ //取数
a[i%10]++;
i/=10;
}
if(flag==1) continue;
while(j>0){
a[j%10]++;
j/=10;
}
while(k>0){
a[k%10]++;
k/=10;
}
for (int w=1;w<=9;w++){ //判断
if(a[w]!=1) flag=1;
}
if(flag==0) printf("%d %d %d\n",o,p,q); //输出
}
return 0;
}
主要还不是很懂为什么
for (int x=123;x<=329;x++){ //枚举
int i=x,j=x*2,k=x*3;
int o=i,p=j,q=k;
int flag=0;
为何x的值要从123开始?
求一种更易懂的解法!
#include<stdio.h>
int main(){
int num,a,b,c;
for(int num=123;num<329;num++){
a=num;b=2*num;c=3*num;
if((a/100+a/10%10+a%10+b/100+b/10%10+b%10+c/100+c/10%10+c%10==45)&&
(a/100)*(a/10%10)*(a%10)*(b/100)*(b/10%10)*(b%10)*(c/100)*(c/10%10)*(c%10)==362880){
printf("%d %d %d\n",a,b,c);
}
}
return 0;
}
最简单代码写法,这个就是暴力枚举!
最后在这里还不得不插播一条笔记就是在第一种方法里面提到的一个c库函数memset:
void *memset(void *str, int c, size_t n)
参数
str -- 指向要填充的内存块。
c -- 要被设置的值。该值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式。
n -- 要被设置为该值的字节数。
在第一个方法里面就是利用了用0来覆盖原来的值得作用。