WY58. 数位重排
描述
牛牛有一个正整数x,牛牛需要把数字x中的数位进行重排得到一个新数(不同于x的数),牛牛想知道这个新数是否可能是原x的倍数。请你来帮他解决这个问题。输入描述
输入包括t+1行,第一行包括一个整数t(1 ≤ t ≤ 10), 接下来t行,每行一个整数x(1 ≤ x ≤ 10^6)输出描述
对于每个x,如果可能重排之后变为自己的倍数输出"Possible", 否则输出"Impossible".示例1
输入:
2 14 1035
输出:
Impossible Possible
C 解法, 执行用时: 1ms, 内存消耗: 372KB, 提交时间: 2020-07-09
#include <stdio.h> #include <stdlib.h> int issame(int a,int b) { int i; int a1[10],b1[10]; memset(a1,0,10*sizeof(int)); memset(b1,0,10*sizeof(int)); while(1) { a1[a%10]++; a/=10; if(a==0) break; } while(1) { b1[b%10]++; b/=10; if(b==0) break; } for(i=0;i<10;i++) { if(a1[i]!=b1[i]) return 0; } return 1; } int main(void) { int t,i,j,tmp,flag; // t=1; scanf("%d",&t); for(i=0;i<t;i++) { flag=0; scanf("%d",&tmp); // tmp=1035; for(j=2;j<10;j++) { if(issame(tmp,tmp*j)==1) { flag=1; break; } } if(flag==1) printf("Possible\n"); else printf("Impossible\n"); } }
C 解法, 执行用时: 2ms, 内存消耗: 296KB, 提交时间: 2021-09-20
#include <stdio.h> #include <stdbool.h> int main() { int t; while(scanf("%d",&t)!=EOF) { int x; while(t--) { scanf("%d",&x); int arr[8]; for(int i=2;i<=9;i++) { arr[i-2]=x*i; } bool flag=false; for(int i=0;i<8;i++) { int n=x; int brr[10]={0}; while(n!=0) { brr[n%10]++; n/=10; } while(arr[i]!=0) { if(brr[arr[i]%10]==0) break; brr[arr[i]%10]--; arr[i]/=10; } if(!arr[i]) { flag=true; break; } } if(flag) printf("Possible\n"); else printf("Impossible\n"); } } return 0; }