官术网_书友最值得收藏!

  • The Modern C++ Challenge
  • Marius Bancila
  • 212字
  • 2021-06-25 22:01:25

14. Validating ISBNs

The International Standard Book Number (ISBN) is a unique numeric identifier for books. Currently, a 13-digit format is used. However, for this problem, you are to validate the former format that used 10 digits. The last of the 10 digits is a checksum. This digit is chosen so that the sum of all the ten digits, each multiplied by its (integer) weight, descending from 10 to 1, is a multiple of 11.

The validate_isbn_10 function, shown as follows, takes an ISBN as a string, and returns true if the length of the string is 10, all ten elements are digits, and the sum of all digits multiplied by their weight (or position) is a multiple of 11:

bool validate_isbn_10(std::string_view isbn)
{
auto valid = false;
if (isbn.size() == 10 &&
std::count_if(std::begin(isbn), std::end(isbn), isdigit) == 10)
{
auto w = 10;
auto sum = std::accumulate(
std::begin(isbn), std::end(isbn), 0,
[&w](int const total, char const c) {
return total + w-- * (c - '0'); });

valid = !(sum % 11);
}
return valid;
}

You can take it as a further exercise to improve this function to also correctly validate ISBN-10 numbers that include hyphens, such as 3-16-148410-0. Also, you can write a function that validates ISBN-13 numbers.

主站蜘蛛池模板: 濉溪县| 汾西县| 攀枝花市| 永嘉县| 屏南县| 阜宁县| 塔河县| 绥滨县| 高唐县| 将乐县| 通化市| 宜兰市| 兴海县| 莱州市| 苍南县| 饶平县| 永济市| 揭阳市| 苍山县| 嘉峪关市| 商城县| 凉城县| 罗平县| 建德市| 天门市| 榆林市| 拜泉县| 柘城县| 永善县| 沙坪坝区| 时尚| 黔南| 安化县| 弥勒县| 文登市| 德化县| 平顺县| 彰化县| 息烽县| 临沂市| 饶阳县|