首页 > 解决方案 > 如何检查一个号码是否只有唯一数字?

问题描述

例如,2345 是唯一数字,因为没有数字显示两次,但 3324 不是唯一数字,因为 3 出现了两次。我尝试使用 % 但我作为(代码)显示但我没有得到数字我得到数字,编辑:你不能使用字符串

number%10==number%100||number%10==number%1000||number%100==number%1000

标签: c

解决方案


您可以使用一个包含 10 个标志的数组来指示是否已经看到了一个数字。在循环中遍历数字,提取个位,检查是否已看到该数字,将数字标记为已看到,然后将数字除以 10 以进行下一次迭代。

正如@Bathsheba 所指出的,在处理负数时需要小心。

例如:

int unique(long long int number)
{
    char seen[10] = {0};

    while (number) {
        int digit = number % 10;

        number /= 10;
        if (digit < 0) {
            /* 
             * The number was negative.  Make it positive.
             * (Note: Checking the number is negative before the while
             * loop could fail when number is LLONG_MIN, so do it here
             * instead.)
             */
            digit = -digit;
            number = -number;
        }
        if (seen[digit]++)
            return 0; /* not unique */
     }
     return 1; /* unique */
 }

long long int如果需要同时处理和,则可能需要单独的函数unsigned long long int,但处理的函数long long int可以使用unsigned long long int如下处理的函数:

#include <limits.h>

int unique_ull(unsigned long long int number)
{
    char seen[10] = {0};

    while (number) {
        int digit = number % 10;

        number /= 10;
        if (seen[digit]++)
            return 0; /* not unique */
     }
     return 1; /* unique */
 }

int unique_ll(long long int number)
{
    unsigned long long int n;

    /* Represent original number as a 2's complement number. */
    n = number;
    if (n > LLONG_MAX) {
        /*
         * Original number was negative, so take its 2's complement to "negate" it.
         * (Note: This works even when original number is LLONG_MIN.)
         */
        n = -n;
    }
    /* Handle as an unsigned long long int. */
    return unique_ull(n);
 }

intmax_t我想以同样的方式支持和支持会很有用uintmax_t

#include <stdint.h>

int unique_um(uintmax_t number)
{
    char seen[10] = {0};

    while (number) {
        int digit = number % 10;

        number /= 10;
        if (seen[digit]++)
            return 0; /* not unique */
     }
     return 1; /* unique */
 }

int unique_m(intmax_t number)
{
    uintmax_t n;

    /* Represent original number as a 2's complement number. */
    n = number;
    if (n > INTMAX_MAX) {
        /*
         * Original number was negative, so take its 2's complement to "negate" it.
         * (Note: This works even when original number is INTMAX_MIN.)
         */
        n = -n;
    }
    /* Handle as a uintmax_t. */
    return unique_um(n);
 }

推荐阅读