在C中查找具有唯一数字的数字

时间:2017-11-01 09:26:57

标签: c arrays

我必须编写一个程序来查找每个数字(0除外),这些数字可以用2-9中的数字来计算。 例如,首先这样的数字将是数字2520,因为它可以被从2到9的每个数字除以。 它也必须是一个只包含其自身数字类型的数字(数字中没有多个数字)。因此,例如2520将不满足此要求,因为存在两个相同的数字(2)。满足这两个要求的数字的例子是7560号。这就是我不知道如何做到这一点。我正在考虑将数组中的值转换为字符串,然后将此字符串放在另一个数组中,以便每个数字都由一个数组条目表示。

#include <stdio.h>
#include <math.h>

int main() {
    int i, n, x, flag, y = 0;
    scanf("%d", &n);
    double z = pow(10, n) - 1;
    int array[(int)z];

    for (i = 0; i <= z; i++) {
        flag = 0;
        array[i] = i;
        if (i > 0) {
            for (x = 2; x <= 9; x++) {
                if (array[i] % x != 0) {
                    flag = 1;
                }
            }

            if (flag == 0) {
                y = 1;
                printf("%d\n", array[i]);
            }
        }
    }

    if (y == 0) {
        printf("not exist");
    }

    return 0;
}

4 个答案:

答案 0 :(得分:2)

这应该给你一个基础:

#include <stdio.h>
#include <string.h>

int main()
{
  char snumber[20];
  int number = 11235;

  printf("Number = %d\n\n", number);

  sprintf(snumber, "%d", number);    
  int histogram[10] = { 0 };    
  int len = strlen(snumber);

  for (int i = 0; i < len; i++)
  {
    histogram[snumber[i] - '0']++;
  }

  for (int i = 0; i < 10; i++)
  {
    if (histogram[i] != 0)
      printf("%d occurs %d times\n", i, histogram[i]);
  }
}

输出:

Number = 11235

1 occurs 2 times
2 occurs 1 times
3 occurs 1 times
5 occurs 1 times

答案 1 :(得分:1)

那段代码很乱。让我们把它包起来。

  

定理:除以2到9范围内所有数字的任何数字都是a   2520的倍数。

因此,您的算法采用

形式
for (long i = 2520; i <= 9876543210 /*Beyond this there must be a duplicate*/; i += 2520){
    // ToDo - reject if `i` contains one or more of the same digit.
}

对于ToDo部分,请参阅How to write a code to detect duplicate digits of any given number in C++?。当然,它是C ++,但接受的答案是逐字逐句的。

答案 2 :(得分:0)

如果我理解正确,你的问题是你需要确定一个数字是否由多个数字组成。 按照您提出的方法,将数字转换为字符串并使用数组来表示数字,我可以为实现它的函数建议以下解决方案。 main函数用于测试has_repeated_digits函数。它只是展示了一种方法。 您可以更改它并在代码中使用它。

#include <stdio.h>

#define MAX_DIGITS_IN_NUM  20

//returns 1 when there are repeated digits, 0 otherwise
int has_repeated_digits(int num){

  // in array, array[0] represents how many times the '0' is found
  // array[1], how many times '1' is found etc...
  int array[10] = {0,0,0,0,0,0,0,0,0,0};
  char num_string[MAX_DIGITS_IN_NUM];

  //converts the number to string and stores it in num_string
  sprintf(num_string, "%d", num);

  int i = 0;
  while (num_string[i] != '\0'){

    //if a digit is found more than one time, return 1.
    if (++array[num_string[i] - '0'] >= 2){
        return 1;   //found repeated digit
    }
    i++;
   }

 return 0;  //no repeated digits found
}


// test tha function

int main()
{
  int x=0;
  while (scanf("%d", &x) != EOF){
    if (has_repeated_digits(x))
        printf("repeated digits found!\n");
    else
        printf("no repeated digits\n");
  }

  return 0;

}

答案 3 :(得分:0)

您可以从这些评论中简化您的问题:

  • 2,3,4,5,6,7,8和9的最小公倍数是2520.
  • 大于9876543210的数字必须至少是其基数10表示中相同数字的两倍。
  • 检查重复的数字可以通过计算连续分区的剩余部分10来完成。

因此,一个简单的方法是枚举2520到9876543210的倍数,并选择没有重复数字的数字。

类型unsigned long long保证足够大以表示要枚举的所有值,但intlong都不是。

以下是代码:

#include <stdio.h>

int main(void) {
    unsigned long long i, n;
    for (n = 2520; n <= 9876543210; n += 2520) {
        int digits[10] = { 0 };
        for (i = n; i != 0; i /= 10) {
            if (digits[i % 10]++)
                break;
        }
        if (i == 0)
            printf("%llu\n", n);
    }
    return 0;
}

此程序在0.076秒内生成 13818 数字。第一个是 7560 ,最后一个 9876351240

数字 0 在技术上与您的约束匹配:它可以被所有非零整数整除,并且没有重复的数字。但是你明确排除了它。