Алгоритм поиска и печати цифр, которые являются общими для двух заданных длинных целых - PullRequest
0 голосов
/ 18 декабря 2018

Пожалуйста, помогите мне с соответствующим алгоритмом C без использования массивов.

Пример:

Ввод

123456789

2037

Выходные данные

Общие цифры: 2, 3, 7.

Моя неудачная попытка:

long a, b, original_a, original_b;
int i, j, figure_a, figure_b;

printf("a=");
scanf_s("%li", &a);
printf("b=");
scanf_s("%li", &b);

original_a = a;
original_b = b;

for (i = 0; i <= 9; i++)
        for (j = 0; j <= 9; j++){
            a = original_a;
            b = original_b;

            while (a||b){
            figure_a = a % 10;
            figure_b = b % 10;

            a /= 10;
            b /= 10;

            if (i == figure_a && j == figure_b && i == j)
                printf("%d, ", i);
        }

    }

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Вы можете преобразовать оба целых числа в строки, а затем сравнить каждый символ первой строки со второй, чтобы проверить, совпадает ли какой-либо из них или нет.Я использовал вложенные циклы для сравнения.

Я использовал строки, потому что сравнивать каждый символ двух строк намного проще, чем сравнивать каждую цифру двух целых.

#include <stdio.h>
int main()
{
    long int a,b;
    int i,j;

    scanf("%ld %ld",&a,&b); //taking both inputs

    char temp_a[50],temp_b[50];


    sprintf(temp_a, "%ld", a); //converting the first integer to a string
    sprintf(temp_b, "%ld", b); //converting the second integer to a string


    int length_a=strlen(temp_a); //length of first string
    int length_b=strlen(temp_b); //length of second string

    // matching whether any character is in common using nested for-loops
    // printing the character as soon as it matches
    // if a character matches, the loop breaks.

    for(i=0 ; i<length_a ; i++)
    {
        for(j=0 ; j<length_b ; j++)
        {
            if(temp_a[i]==temp_b[j])
            {
                printf("%c",temp_a[i]);
                break;
            }
        }
    }
}
0 голосов
/ 19 декабря 2018

Может помочь:

#include <stdio.h>
int original_a, original_b, i;
short digit_a, digit_b, digit_common;
short find_digit(int num);
int main()
{
printf("Insert 2 numbers a and b\n");
scanf("%d %d", &original_a, &original_b);
digit_a = find_digit(original_a);
digit_b = find_digit(original_b);
digit_common = digit_a & digit_b;
printf("digit_common: %x\n", digit_common);
printf("Common digits of a and b\n");
for(i = 0; i < 10; i++){
    if(digit_common & (1<<i)){
        printf("%d",i);
    }
}
return 0;

}

short find_digit(int num){
short result = 0;
while(num>0){
    result |= (1 << (num%10));
    num /= 10;
}
return result;

}

0 голосов
/ 18 декабря 2018

Это небольшая забавная проблема.

Я собрал быстрое и простое решение:

#include <stdio.h>

int main(void)
{
    int a, b;
    int d[10]={0};
    scanf("%d %d", &a, &b);

    while(a)
    {
        d[a%10] = 1;
        a /= 10;
    }

    while(b)
    {
        if (d[b%10]) d[b%10]=2;
        b /= 10;
    }

    for(a=0;a<10;++a) if (d[a]==2) printf("%d ", a);

    return 0;
}

Ссылка на IDE Один код


Вот краткая версия, в которой не используются массивы:

#include <stdio.h>

int main(void)
{
    int a, b, c;
    scanf("%d %d", &a, &b);

    while(a)
    {
        c = b;
        while(c)
        {
            if (c%10 == a%10)
            {
                printf("%d ", c%10);
                break;
            }
            c /= 10;
        }
        a /= 10;
    }

    return 0;
}

Эта версия работает медленнее, чем моя первая, и не печатает числа в порядке возрастания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...