83 条题解
-
0叶孤鸿 LV 5 @ 2020-01-24 13:52:12
仅供参考
#include<iostream>
using namespace std;
int main()
{
for (int i=123;i<329;i++)
{
int pd=1;
int x=i;int y=x*2;int z=x*3;
int x1=x;int y1=y;int z1=z;
int a[9];
a[0]=x%10;x/=10;a[1]=x%10;x/=10;a[2]=x%10;
a[3]=y%10;y/=10;a[4]=y%10;y/=10;a[5]=y%10;
a[6]=z%10;z/=10;a[7]=z%10;z/=10;a[8]=z%10;
for (int k=0;k<8;k++)
{
for (int j=k+1;j<9;j++)
{
if (a[k]==a[j]){pd=0;}
if (a[j]==0){pd=0;}
}
}
if (pd==1)cout<<x1<<' '<<y1<<' '<<z1<<endl;
}
} -
02019-12-25 22:52:26@
用一个bool的数组记录每次是不是9个不同的数,然后检查i=123到329。
memset需要用到string.h,实现起来更快,不然需要跑一个for loop来重置arr里的值。
```cpp
#include <iostream>
#include <cstring>
using namespace std;bool arr[9];
bool check(int n) {
for (int i = 0; i < 3; i++) {
int x = n % 10;
if (x != 0 && !arr[x - 1]) {
arr[x - 1] = 1;
}
else
return 0;
n /= 10;
}
return 1;
}int main(int argc, char *argv[]) {
for (int i = 123; i <= 329; i++) {
memset(arr, 0, 9);
if (check(i) && check(2 * i) && check(3 * i))
printf("%d %d %d\n", i, 2 * i, 3 * i);
}
return 0;
} -
02019-08-23 16:42:33@
这题 最暴力的算法是:
枚举每个位数上的所有可能。时间复杂度为\(9^9=387420489\),这显然不行,中间的剪枝加了可能优化为\(9!\)能过。
但是,我们完全可以枚举第一个数。出于重复的考虑,第一个数在\(123\)和\(333\)之间。然后算出第二、三个数,一波验证即可。
#include<bits/stdc++.h> using namespace std; inline bool check(int x,int y,int z) { int h[10]={0}; while(x) h[x%10]++,x/=10; while(y) h[y%10]++,y/=10; while(z) h[z%10]++,z/=10; for(int i=1;i<=9;i++) if(h[i]!=1) return 0; return 1; } int main(){ for(int i=123;i<=333;i++) if(check(i,2*i,3*i)) printf("%d %d %d\n",i,2*i,3*i); return 0; }
给个赞!
-
02019-08-01 21:53:44@
##python
##验证的难度往往小于求解!!for i in range(123, 329):
num_1 = i
num_2 = 2 * i
num_3 = 3 * i
str_123 = str(num_1) + str(num_2) + str(num_3)
set_123 = set(str_123)
list_123 = list(set_123)
if (len(list_123) == 9) and ('0' not in list_123):
out_put = str(num_1) + ' ' + str(num_2) + ' ' + str(num_3)
print(out_put) -
02019-07-26 18:21:03@
暴力枚举法:
#include<iostream> using namespace std; int a[350],b[350],c[350]; void f(int x,int y,int z); int main() { int n=100,t=1; while(n*3<1000) { a[t]=n*1; b[t]=n*2; c[t]=n*3; t++; n++; } for(int i=1;i<=n;i++) f(a[i],b[i],c[i]); return 0; } void f(int x,int y,int z) { int j[10]={0,0,0,0,0,0,0,0,0,0}; int x1=x,y1=y,z1=z; for(int i=1;i<=3;i++) { j[x1%10]++;j[y1%10]++;j[z1%10]++; x1=(x1-x1%10)/10; y1=(y1-y1%10)/10; z1=(z1-z1%10)/10; } for(int i=1;i<=9;i++) if(j[i]>1||j[i]==0) return; cout<<x<<" "<<y<<" "<<z<<endl; }
-
02019-05-21 13:22:48@
#include<iostream>
using namespace std;
int main(){
cout<<"192 "<<"384 "<<"576"<<endl<<"219 "<<"438 "<<"657"<<endl<<"273 "<<"546 "<<"819"<<endl<<"327 "<<"654 "<<"981"<<endl;
return 0;
} -
02019-03-07 22:02:10@
~~你们太菜啦~~
#include<iostream>
#include<cstring>
using namespace std;
bool used[10];
int main(){
for(int i = 100; i <= 999; i ++){
int o = i * 1, oo = o;
int j = i * 2, p = j;
int k = i * 3, q = k;
memset(used, false, sizeof(used));
bool flag = false;
while(o != 0){
int s = o % 10;
if(!used[s] && s != 0) used[s] = true;
else {
flag = true;
break;
}
o /= 10;
}
if(flag) continue;
flag = false;
while(j != 0){
int s = j % 10;
if(!used[s] && s != 0) used[s] = true;
else {
flag = true;
break;
}
j /= 10;
}
if(flag) continue;
flag = false;
while(k != 0){
int s = k % 10;
if(!used[s] && s != 0) used[s] = true;
else {
flag = true;
break;
}
k /= 10;
}
if(flag) continue;
if(p <= 999 && q <= 999){
cout << oo << ' ' << p << ' ' << q << endl;
}
}
return 0;
} -
02019-02-04 09:42:52@
利用集合做的
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cstdlib> #include <set> using namespace std; int a,b,c,i,j,k,i1,i2,j1,j2,k1,k2; void insertAll(set<int> &s){ s.insert(i),s.insert(j),s.insert(k); s.insert(i1),s.insert(j1),s.insert(k1); s.insert(i2),s.insert(j2),s.insert(k2); } int main(){ for(i=1; i<4; i++){ for(j=1;j<=9;j++){ for(k=1;k<=9;k++){ if(k!=i && k!=j && i!=j){ set<int> s; a = i*100+j*10+k; b = a*2; c = a*3; if(c>=1000) break; i1 = b/100; j1 = b%100/10; k1 = b%10; i2 = c/100; j2 = c%100/10; k2 = c%10; insertAll(s); if(s.size()==9&&!s.count(0)){ printf("%d %d %d\n",a,b,c); } } } } } }
-
02018-09-02 18:29:48@
致小白
-
02018-08-27 15:56:55@
#include<cstdio>
using namespace std;
int a[10],book[10],n1,n2,n3;
void output(){
n1=a[1]*100+a[2]*10+a[3];
n2=a[4]*100+a[5]*10+a[6];
n3=a[7]*100+a[8]*10+a[9];
if(n1*2==n2&&n1*3==n3)
printf("%d %d %d\n",n1,n2,n3);
return;
}
void dfs(int step){
int i;
if(step>9)output();
for(i=1;i<=9;i++){
if(book[i]==0){
book[i]=1;
a[step]=i;
dfs(step+1);
book[i]=0;
}
}
}
int main(){
dfs(1);
return 0;
} -
02018-07-18 15:07:52@
#include<iostream>
using namespace std;
bool test(int x) //判断当前数是否由1~9构成
{
int a[10]={0};
while(x)
{
a[x%10]++;
x/=10;
}
for(int i=1;i<=9;i++)
if(a[i]!=1) return false;
return true;
}
int main()
{
int a,b,c,d;
for(int i=1;i<=333;i++) //保证生成的三数比为1:2:3
{
a=i*1,b=i*2,c=i*3;
d=a*1000000+b*1000+c;
if(test(d)) cout<<a<<" "<<b<<" "<<c<<endl;
}
return 0;
} -
02018-07-10 17:36:55@
直接用C++的全排列函数next_permutation,然后超过333不可能直接跳出
#include <iostream> #include <algorithm> using namespace std; int main() { int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; do{ // for(int i = 0; i < 9; ++i) printf("%d ", arr[i]); // printf("\n"); int num[3]; for(int i = 0;i < 3; ++i) { num[i] = arr[3 * i] * 100 + arr[3 * i + 1] * 10 + arr[3 * i + 2]; } if(num[0] > 333) break; if(num[0] * 2 == num[1] && num[0] * 3 == num[2]) printf("%d %d %d\n", num[0], num[1], num[2]); }while(next_permutation(arr, arr + 9)); return 0; }
-
02018-06-11 08:41:42@
#include<iostream>
#include<cstdio>
using namespace std;
int mark[10];
int main(){
for(int i=111;i<=333;i++){
for(int i=0;i<=9;i++)mark[i]=0;
int a1=i;
int a2=i*2;
int a3=i*3;
if(mark[a1%10])continue;
mark[a1%10]=1;
if(mark[a1/10%10])continue;
mark[a1/10%10]=1;
if(mark[a1/100%10])continue;
mark[a1/100%10]=1;
if(mark[a2%10])continue;
mark[a2%10]=1;
if(mark[a2/10%10])continue;
mark[a2/10%10]=1;
if(mark[a2/100%10])continue;
mark[a2/100%10];
if(mark[a3%10])continue;
mark[a3%10];
if(mark[a3/10%10])continue;
mark[a3/10%10]=1;
if(mark[a3/100%10])continue;
mark[a3/100%10]=1;
if(mark[0]==1)continue;
printf("%d %d %d\n",a1,a2,a3);
}
return 0;
} -
02018-04-27 15:40:11@
#include <iostream>
#include <algorithm>
int a0[9]={'1','2','3','4','5','6','7','8','9'};int Now[1005];int Count=0;
using namespace std;
bool Check(int a,int b,int c)
{int K=0,op[9],bis;
while(a!=0)
{
op[K]=a%10;
a/=10;
K++;
}
while(b!=0)
{
op[K]=b%10;
b/=10;
K++;
}
while(c!=0)
{
op[K]=c%10;
c/=10;
K++;
}
for(int a=0;a<9;a++)
for(int b=a+1;b<9;b++)
{
if(op[a]==op[b])
return 0;
}
return 1;
}
int main()
{
for(int a=1;a<10;a++)
for(int b=1;b<10;b++)
for(int c=1;c<10;c++)
if(a!=b&&b!=c&&c!=a)
{
Now[Count]=a*100+b*10+c;
Count++;
}
sort(Now,Now+1003);
for(int a=0;a<1005;a++)
for(int b=0;b<1005;b++)
for(int c=0;c<1005;c++)
if(Now[a]*2==Now[b]&&Now[a]*3==Now[c]&&Now[a]!=0)
{
if(Check(Now[a],Now[b],Now[c]))
cout<<Now[a]<<" "<<Now[b]<<" "<<Now[c]<<endl;
}
} -
02018-04-21 22:37:35@
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;int cmp(int a[9], int b[9])
{
int p;
for(int x=0; x<9; x++)
{
p=1;
if(a[x] != b[x])
p=0;
}
if(p=1)
return 0;
else
return 1;
}int main ()
{
int i, j, k;
int a1[9]={1,2,3,4,5,6,7,8,9}, a2[9], b[3];for(i=123; i<=329; i++)
{
j = 2*i;
k = 3*i;
b[0] = i;
b[1] = j;
b[2] = k;
for(int n=0, m=0; n<3; n++)
{
a2[m] = b[n]/100;
a2[m+1] = b[n]/10%10;
a2[m+2] = b[n]%10;
m += 3;
}
sort(a2, a2+9);int p=0;
for(int x=0; x<9; x++)
{
if(a2[x] != a1[x])
{
p=1;
break;
}
}
if(p == 0)
printf("%d %d %d\n", i, j, k);
}}
-
02018-04-08 16:20:56@
java来一波
import java.util.Arrays; import java.util.HashMap; public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //A[1]=1则表示1这个数字使用过 int[] A=new int[10]; //关键是满足1:2:3这个比例关系 for(int i=100;i<334;++i){ //每趟循环前均置0 Arrays.fill(A, 0); int p=i; int q=2*i; int r=3*i; //需要判断数字0没有出现过,否则会多出267 534 801这一组 if(judge(A,p)&&judge(A,q)&&judge(A,r)&&A[0]==0){ System.out.println(p+" "+q+" "+r); } } } //将一个三位数的每一位的信息存在A中 public static boolean judge(int[] A,int number){ while(number>0){ int tmp=number%10; if(A[tmp]==0){//未出现过则置1 A[tmp]=1; } else{//出现过 return false; } number/=10; } return true; } }
-
02018-04-02 13:19:50@
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int r,j;
for (int i=123;i<=987;i++)
{
if ((i%10!=i/100)&&(i%10!=(i-i/100*100)/10)&&(i/100!=(i-i/100*100)/10))
{
j=i*2;
r=i*3;
if (r<=987&&r==j*1.5&&(j%10!=j/100)&&(j%10!=(j-j/100*100)/10)&&(j/100!=(j-j/100*100)/10)&&(r%10!=r/100)&&(r%10!=(r-r/100*100)/10)&&(r/100!=(r-r/100*100)/10)&&j/100!=i/100&&j/100!=i%10&&j/100!=(i-i/100*100)/10&&r/100!=i/100&&r/100!=i%10&&r/100!=(i-i/100*100)/10&&j/100!=r/100&&j/100!=r%10&&j/100!=(r-r/100*100)/10&&j%10!=i/100&&j%10!=i%10&&j%10!=(i-i/100*100)/10&&r%10!=i/100&&r%10!=i%10&&r%10!=(i-i/100*100)/10&&j%10!=r/100&&j%10!=r%10&&j%10!=(r-r/100*100)/10&&(j-j/100*100)/10!=r/100&&(j-j/100*100)/10!=r%10&&(j-j/100*100)/10!=(r-r/100*100)/10&&(j-j/100*100)/10!=i/100&&(j-j/100*100)/10!=i%10&&(j-j/100*100)/10!=(i-i/100*100)/10&&j%10!=0&&j/100!=0&&(j-j/100*100)/10!=0&&r%10!=0&&r/100!=0&&(r-r/100*100)/10!=0&&i%10!=0&&i/100!=0&&(i-i/100*100)/10!=0)
{
cout<<i<<" "<<j<<" "<<r<<endl;
}
}
}
return 0;
} -
02018-04-02 13:15:56@
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int r;
for (int i=123;i<=987;i++)
{
if ((i%10!=i/100)&&(i%10!=(i-i/100*100)/10)&&(i/100!=(i-i/100*100)/10))
{
for (int j=2*i;j<=987;j+=i)
{
r=i*3;
if (r<=987&&r==j*1.5&&(j%10!=j/100)&&(j%10!=(j-j/100*100)/10)&&(j/100!=(j-j/100*100)/10)&&(r%10!=r/100)&&(r%10!=(r-r/100*100)/10)&&(r/100!=(r-r/100*100)/10)&&j/100!=i/100&&j/100!=i%10&&j/100!=(i-i/100*100)/10&&r/100!=i/100&&r/100!=i%10&&r/100!=(i-i/100*100)/10&&j/100!=r/100&&j/100!=r%10&&j/100!=(r-r/100*100)/10&&j%10!=i/100&&j%10!=i%10&&j%10!=(i-i/100*100)/10&&r%10!=i/100&&r%10!=i%10&&r%10!=(i-i/100*100)/10&&j%10!=r/100&&j%10!=r%10&&j%10!=(r-r/100*100)/10&&(j-j/100*100)/10!=r/100&&(j-j/100*100)/10!=r%10&&(j-j/100*100)/10!=(r-r/100*100)/10&&(j-j/100*100)/10!=i/100&&(j-j/100*100)/10!=i%10&&(j-j/100*100)/10!=(i-i/100*100)/10&&j%10!=0&&j/100!=0&&(j-j/100*100)/10!=0&&r%10!=0&&r/100!=0&&(r-r/100*100)/10!=0&&i%10!=0&&i/100!=0&&(i-i/100*100)/10!=0)
{
cout<<i<<" "<<j<<" "<<r<<endl;
}
}
}
}
return 0;
}
if语句中,全为判断 -
02018-03-25 18:56:02@
太水了,来一波恶心的……
#include<bits/stdc++.h> using namespace std ; //Vijos P1772 int main() { printf("192 384 576\n219 438 657\n273 546 819\n327 654 981") ; return 0 ; }
有一道题目是输入三个数的比例在输出,这才有意思,大家不妨去找来坐坐。
-
02018-03-01 11:10:31@
import java.util.HashSet; import java.util.Set; public class Main { public static void main(String[] args){ for(int i=123;i<330;i++){ int a = i; int b = i * 2; int c = i * 3; if(confirm(String.valueOf(a), String.valueOf(b), String.valueOf(c))){ System.out.println(a+" "+b+" "+c); } } } private static boolean confirm(String a, String b, String c){ Set<String> set = new HashSet<String>(); for(int i=0;i<3;i ++){ set.add(a.substring(0, 1)); set.add(b.substring(0, 1)); set.add(c.substring(0, 1)); a = a.substring(1); b = b.substring(1); c = c.substring(1); } if(set.size() == 9 && !set.contains("0")){ return true; }else{ return false; } } }