AcWing 3634. IP地址-JavaScript
原题链接
简单
作者:
semicloud
,
2024-03-30 22:38:04
,
所有人可见
,
阅读 1
const fs = require('fs');
/**
* 返回一个字符串是否只由数字字符组成
* @param {string} s
*/
function onlyDigits(s) {
for (const ch of s) {
if (ch.codePointAt(0) < 48 || ch.codePointAt(0) > 57) return false;
}
return true;
}
/**
* 将字符串解析为十进制数字,要求字符串中只包含0-9
* @param {string} s 只包含数字字符的字符串
*/
function parseNumber(s) {
let res = 0;
let base = 1;
for (let i = s.length - 1; i > -1; --i) {
res = res + (s[i] - '0') * base;
base *= 10;
}
return res;
}
/**
* 十进制转十六进制
* @param {number} n
*/
function decToHex(n) {
const arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'];
let res = '';
while (n) {
res += arr[(n % 16)];
n = Math.floor(n / 16);
}
res = res.split('').reverse().join('').padStart(2, '0');
return res;
}
/**
* 返回s是否是一个合法的IP段
* @param {string} s
*/
function validIpToken(s) {
if (!onlyDigits(s)) return false;
const num = parseNumber(s);
return num >= 0 && num <= 255;
}
const line = fs.readFileSync(0, 'utf-8').trim().split('\n')[0];
const tokens = line.split('.').map(x => x.trim()).filter(x => x.length > 0);
if (tokens.length !== 4 || tokens.some(token => !validIpToken(token))) {
console.log('Error');
} else {
console.log(`0x${tokens.map((token) => decToHex(parseNumber(token))).join('')}`);
}