YTU OJ 2360: 最簡IPv6表示
阿新 • • 發佈:2018-12-17
2360: 最簡IPv6表示
題目描述
現在大家用的IP地址都是IPv4的,不過在不久的將來IPv6將要完全替代IPv4。IPv6的128位地址按每16位劃分為一個位段,每個位段被轉換為一個4位的16進位制數,並用冒號“:”隔開,這種表示法稱為冒號16進製表示法(colon hexadecimal)。如以下的IPv6地址:21DA:0000:0000:0000:02AA:000F:FE08:9C5A。不過這種表示方法不是很簡潔,還可以通過以下的方法對IPv6地址進行簡化:
1、壓縮某個位段中的前導0來簡化IPv6地址的表示。如上面的地址可以化簡為21DA:0:0:0:2AA:F:FE08:9C5A。
2、有些型別的IPv6地址中包含了一長串0.為了進一步簡化IP地址表達,在一個以冒號16進製法表示的IPv6地址中,如果幾個連續位段的值都為0,那麼這些0就可以簡寫為: :,稱為雙冒號表示法。那麼,前面的結果又可以簡化寫為:21DA::2AA:F:FE08:9C5A。注意雙冒號::在一個地址中只能出現一次。當出現多個可以用::表示的地方時,只對前面的用雙冒號表示法。
輸入
輸入有多組資料以EOF結束。每組輸入一個IPv6地址的完整表示。
輸出
對於每組IPv6地址輸出其最簡的表示形式,每組輸出佔一行。如果輸入的IPv6地址有錯誤,輸出“It's not a IPv6 address!”。
樣例輸入
21DA:0000:0000:0000:02AA:000F:FE08:9C5A
21DA:0103:0000:0000:02AA:000F:FE08:9C5A
21DZ:0000:0000:0000:02AA:000F:FE08:9C5A
樣例輸出
21DA::2AA:F:FE08:9C5A
21DA:103::2AA:F:FE08:9C5A
It's not a IPv6 address!
提示
注意輸入輸出的格式。
#include<iostream> #include<cstdio> using namespace std; char a[100]; char b[100]; int main() { while(cin>>a) { int f=0; int f1=0; for(int i=0;a[i]!='\0';i++) { if((a[i]>='A'&&a[i]<='F')||(a[i]>='a'&&a[i]<='f')||a[i]==':'||(a[i]>='0'&&a[i]<='9')) { if(a[i]==':') { f=0; } else if(a[i]=='0'&&f==0) { a[i]='='; } else if(a[i]!='0'&&f==0) { f=1; } } else { cout<<"It's not a IPv6 address!"; f1=1; break; } } if(f1==0) { int k=0; int f2=0; for(int i=0;a[i]!='\0';i++) { if(a[i]!='=') { b[k]=a[i]; k++; } } b[k]='\0'; for(int i=0;i<k;i++) { if(b[i]==':'&&b[i+1]==':'&&b[i+2]==':'&&f2==0) { cout<<b[i]<<b[i+1]; i+=2; for(int j=i+1;j<k;j++) { if(b[j]==':') { i=j; } else { break; } } f2=1; } else if(b[i]==':'&&b[i+1]==':') { cout<<b[i]<<'0'; } else { cout<<b[i]; } } } cout<<endl; } return 0; }