首页 > 其他分享 >C语言:IPv6地址压缩

C语言:IPv6地址压缩

时间:2022-11-18 12:23:48浏览次数:45  
标签:0000 max 压缩 C语言 地址 2001 IPv6

题目

IPv6 二进位制下为 128 位长度,以 16 位为一组,每组以冒号“:”隔开,可以分为 8组,每组以 4 位十六进制方式表示。
例如:2001:0db8:0000:0000:0123:4567:89ab:cdef 是一个合法的 IPv6 地址。

同时 IPv6 地址在某些条件下可以压缩:
 1、每组数字代表的独立 16 进制数可以省略前位的 0。
 例如上面的 IPv6 地址可被压缩为:2001:db8:0:0:123:4567:89ab:cdef

 2、可以用双冒号“::”表示一组 0 或多组连续的 0,但只能出现一次。
 例如上面的 IPv6 地址可被压缩为:2001:db8::123:4567:89ab:cdef

规则补充:
 1、输入数据为完全展开的 IPv6 地址,确保输入的 IPv6 地址不含双冒号,每组地址省略的 0 都会被补充上去。

 2、双冒号只能使用一次,因此我们压缩最长的全 0 组
 比如:2001:0db8:0000:0000:1:0000:0000:0000
 我们压缩为 2001:db8:0:0:1:: 而非 2001:db8::1:0:0:0

 3、双冒号只能只用一次,因此我们在我们遇到地址中多个连续全 0 组长度相同时,我们压缩最前面的一个。
 比如:2001:0db8:0000:0000:ffff:0000:0000:1
 压缩为 2001:db8::ffff:0:0:1,而非 2001:db8:0:0:ffff::1

 4、输入的 IPv6 地址可能无法被压缩,因此请照原样输出


代码


#include<stdio.h> 

int main(){
	int a[10];
	int i,start,end;
	int max[3]={0,0,0},len=0;
	
	scanf("%x:%x:%x:%x:%x:%x:%x:%x",
		&a[1],&a[2],&a[3],&a[4],&a[5],&a[6],&a[7],&a[8]);
	a[0]=1;a[9]=1; 
	for(i=0;i<10;i++){
		if(a[i]==0){
			if(a[i-1]!=0){
				len = 1;
				start = i;
			}
			else{
				len += 1;
				end = i;
			}
		}
		else{
			if(len>max[0]){
				max[0] = len;
				max[1] = start;
				max[2] = end;
				len = 0; 
			}
		}
	}
	if(max[1]==1)printf(":");
	for(i=1;i<9;i++){
		if(i<max[1])printf("%x:",a[i]);
		if(i>max[2])printf(":%x",a[i]);
	}
	if(max[2]==8)printf(":");
	return 0;
}

标签:0000,max,压缩,C语言,地址,2001,IPv6
From: https://www.cnblogs.com/Shin404/p/16902786.html

相关文章

  • C语言:大数减法
    题目输入两个正整数(20位以上),计算两个数的差 例如:  输入:5626255555855853666554212125121252222521  输出:2050430437306314144代码#include<stdio.h>#inclu......
  • C语言:最小子数组和
    题目给你一个整数数组,请你找出一个具有最小和的连续子数组(子数组最少包含一个元素),返回其最小和。子数组是数组中的一个连续部分。 例如:  输入:-21-34-1-21-......
  • C语言:蛇形方阵
    题目给出一个不大于9的正整数n,输出n×n的蛇形方阵。从右上角填上1开始,逆时针方向依次填入数字,如同样例所示。注意每个数字都右对齐,中间用空格隔开。 例如:  ......
  • C语言:连续子串
    题目输入一个字符串,输出其所有的子串(不包含本身,输出每个子串间有空格)。子串:对于一个字符串变量,例如"adereegfbw",它的子串就是像"ader"这样可以从中找到的连续的字符......
  • C语言:规则排序
    题目输入正整数n,再输入n个正整数,先将其中的奇数从小到大排序,再将偶数从大到小排序。 例如:  输入:828522391125  输出:35911252282代码#in......
  • C语言:亲密数对
    题目输入N,N在2至3000之间,求2至N中的亲密数对。所谓亲密数对,就是A的因子和等于B,B的因子和等于A,且A≠B。如48和75是亲密数对。48的因子和为2+3+4+6......
  • C语言:学号输出
    题目用输出你的学号对应的八位数(每位数大小为55,每个数之间距离三个空格) 例如  输入12345678 输出: 代码#include<stdio.h>intmain(){charinp......
  • C语言:一元二次方程求解
    题目已知一元二次方程......
  • C语言:时间计算
    题目给出当前时间(XX时XX分XX秒),计算经过n秒后的时间,输出格式(XX时XX分XX秒,注意0的补位),超过24时则显示第二天的时间。 例如:  输入:09时11分22秒125秒  输出:09时13......
  • 计算机等级考试二级C语言程序设计专项训练题——程序设计题(四)
    31、请编写函数voidfun(charxx[]),函数的功能是:将字符串数组xx中下标为奇数的字符按其ASCII值从大到小的顺序进行排序。例如:源字符串为:abcdefgh,则处理后字符串为:ahcfedgb......