题目:大意是在说给定一个ipv6地址的简记形式,让你给它补全输出。
简记的规则大致是把地址中的一部分0去掉,其中还包括一连串的0,此时可用::来代替。
方法:首先记录给定的字符串中的:的个数,让后就能确定::中间要补全的0000的个数,然后对于每个小地址(例如bfd),补全失去的0就好了,这时候可以使用printf输出补0的功能,即:printf("%04s",s);
注意:本来每个字符串中:的个数是不能超过7个的,但是会出现::连用,就可能出现8个,这样对于计算::之间补全0000的个数计算就会造成困难,所以要单独处理。
代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int main() { int n; cin>>n; while(n--) { char s[100]; char t[5]; memset(t,0,sizeof(t)); cin>>s; int len=strlen(s),k=0 ; int ans=0,tt=0; for(int i=0; i<len; i++) if(s[i]==‘:‘) ans++; ans=7-ans; if(ans<0) for(int i=0; i<len; i++) { if(s[i]==‘:‘&&s[i+1]==‘:‘) { for(int j=i+1; j<len; j++) s[j]=s[j+1]; len--; break; } } for(int i=0; i<len; i++) { if(s[i]==‘:‘) { printf("%04s",t); k++; if(k<8) cout<<":"; if(s[i+1]==‘:‘) for(int j=1; j<=ans; j++) { printf("0000"); k++; if(k<8) cout<<":"; } memset(t,0,sizeof(t)); tt=0; } else t[tt++]=s[i]; } printf("%04s",t); cout<<endl; } return 0; }
codeforces 250B Restoring IPv6,码迷,mamicode.com
时间: 2024-10-12 04:10:58