标签:
学习:
字符串的下一个排列,字符串的大小比较。strcmp;
stl:
#include<bits/stdc++.h> using namespace std; typedef long long ll; char c[50],b[50]; int main(){ int T; scanf("%d",&T); while(T--){ scanf("%s",b); int len = strlen(b); if(len & 1){ len = (len + 1) / 2; for(int i = 0 ; i < len ; i ++) printf("4"); for(int i = len ; i < 2 * len ; i ++) printf("7"); printf("\n"); }else{ memset(c,0,sizeof(c)); for(int i = 0 ; i < len / 2 ; i ++) c[i] = ‘4‘; for(int i = len / 2 ; i < len ; i ++) c[i] = ‘7‘; bool f = true; do{ if(strcmp(c,b) >= 0){ f = false; printf("%s\n",c); break; } }while(next_permutation(c,c+len)); if(f){ for(int i = 0 ; i < (len+2) / 2 ; i ++) printf("4"); for(int i = (len+2) / 2 ; i < len+2 ; i ++) printf("7"); printf("\n"); } } } return 0; }
按位dfs:
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 5 ll n; 6 bool f; 7 int calc(ll x){ 8 int cnt = 0; 9 while(x){ 10 cnt ++; 11 x /= 10; 12 } 13 return cnt; 14 } 15 16 void dfs(ll now,int lx,int ly){ 17 if(f) return; 18 // cout << "now :" << now << " " << lx << " " << ly << endl; 19 if(now >= n && lx == 0 && ly == 0){ 20 printf("%lld\n",now); 21 f = true; 22 return; 23 } 24 if(lx) dfs(now*10+4,lx-1,ly); 25 if(ly) dfs(now*10+7,lx,ly-1); 26 return ; 27 } 28 29 int main(){ 30 31 int T; 32 scanf("%d",&T); 33 while(T--){ 34 scanf("%lld",&n); 35 int len = calc(n); 36 if(len & 1) len ++; 37 if(!n) printf("47\n"); 38 if(!n) continue; 39 if(len >= 20){ 40 for(int i = 0 ; i < len/2 ; i ++) printf("4"); 41 for(int i = 0 ; i < len/2 ; i ++) printf("7"); 42 printf("\n"); 43 }else{ 44 f = false; 45 dfs(0,len >> 1,len >> 1); // 4和7数量相等 46 if(!f){ 47 for(int i = 0 ; i < (len+2)/2 ; i ++) printf("4"); 48 for(int i = 0 ; i < (len+2)/2 ; i ++) printf("7"); 49 printf("\n"); 50 } 51 } 52 } 53 return 0; 54 }
标签:
原文地址:http://www.cnblogs.com/zstu-jack/p/5450458.html