补一些基础简单题purple7
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <bits/stdc++.h> 3 using namespace std; 4 5 bool check(int x,int y) 6 { 7 int a[10]; 8 memset(a,0,sizeof(a)); 9 if(x<10000||y<10000) a[0]=1; // 10 if(x<10000&&y<10000) return false; // 11 while(x) 12 { 13 int temp=x%10; 14 if(a[temp]) return false; 15 a[temp]=1; 16 x/=10; 17 } 18 while(y) 19 { 20 int temp=y%10; 21 if(a[temp]) return false; 22 a[temp]=1; 23 y/=10; 24 } 25 26 return true; 27 } 28 29 int main() 30 { 31 int n; 32 int flag=0; 33 while(scanf("%d",&n)&&n) 34 { 35 if(flag) 36 { 37 puts(""); 38 } 39 else flag=1; 40 int ok=0; 41 for(int i=1234;;i++) 42 { 43 int y=i*n; 44 if(y>98765) break; 45 46 if(check(i,y)) ok=1,printf("%d / %05d = %d ",y,i,n); 47 } 48 if(!ok) printf("There are no solutions for %d. ",n); 49 } 50 }
子集生成:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <bits/stdc++.h> 3 using namespace std; 4 //子集生成lrjp188 5 6 //增量法 7 void print_subset_dxdy(int n,int *A,int cur) 8 { 9 for(int i=0;i<cur;i++) printf("%d ",A[i]); //打印当前集合 10 puts(""); 11 int s=cur ? A[cur-1]+1 : 0; // 获取当前元素的最小可能值 12 for(int i=s;i<n;i++) 13 { 14 A[cur]=i; 15 print_subset_dxdy(n,A,cur+1); //递归构造子集 16 } 17 } 18 //位向量法 19 void print_subset_vector(int n,int *B,int cur) 20 { 21 if(cur==n) 22 { 23 for(int i=0;i<n;i++) if(B[i]) printf("%d ",i); 24 puts(""); 25 return; 26 } 27 B[cur]=1; //选第cur个人元素 28 print_subset_vector(n,B,cur+1); 29 B[cur]=0; //不选第cur个元素 30 print_subset_vector(n,B,cur+1); 31 } 32 //二进制法 33 void print_subset_binary(int n,int s) 34 { 35 for(int i=0;i<n;i++) 36 if(s&(1<<i)) printf("%d ",i); 37 puts(""); 38 } 39 40 int A[1010]; 41 int main() 42 { 43 int n; 44 while(scanf("%d",&n)&&n) { 45 printf("增量法: "); 46 print_subset_dxdy(n,A,0); 47 puts("位向量法:"); 48 print_subset_vector(n,A,0); 49 puts("二进制法:"); 50 for(int i=0;i<(1<<n);i++) //枚举各子集所对应的的编码 51 print_subset_binary(n,i); 52 } 53 }