Golang задачка по циклам на проверку совпадения цифр в двух числах

Даны два числа. Определить цифры, входящие в запись как первого, так и второго числа. Программа получает на вход два числа. Гарантируется, что цифры в числах не повторяются. Числа в пределах от 0 до 10000. Программа должна вывести цифры, которые имеются в обоих числах, через пробел. Цифры выводятся в порядке их нахождения в первом числе. Ввод: 564 8954 Вывод: 5 4

код:

`

var a, b, c, d int
fmt.Scan(&a, &b)

for a > 0 {
    d = a % 10
    a = a / 10
    c = b
    for  c > 0 {
        if c % 10 == d {
            fmt.Println(d, " ")
        }
        c = c / 10
    }
}
fmt.Println("\n")

`

Выводится 4 5, как изменить порядок проверки, вывода?


Ответы (5 шт):

Автор решения: Эникейщик
  1. Перевести оба числа в строку и проверять наличие каждой цифры из первого числа во втором.

или

  1. Делать, как у вас, но заносить результат в массив, потом вывести массив в обратном порядке.

или

  1. Заносить каждую найденую цифру в строку с результатом, но присоединять не с конца, а с начала.
→ Ссылка
Автор решения: Anna

Можно создать функцию, которая "развернет" оба числа перед началом циклов. В этом способе есть косяк, что при реверсе числа, заканчивающегося на ноль, он этот ноль потеряет. Но для примера в задаче (564 8954) прокатит, вывод будет верный ;)

func reverse_int(n int) int {
    new_int := 0
    for n > 0 {
        remainder := n % 10
        new_int *= 10
        new_int += remainder
        n /= 10
    }
    return new_int
}
→ Ссылка
Автор решения: Imunitet

Нужно с самого начала делать не обратный перебор:

package main

import "fmt"
func main() {
    var x int
    var y int
    var k int
    fmt.Scan(&x)
    fmt.Scan(&y)
    for j:=1000; x/j>=0; j=(j/10){
        if(x/j==0){
            continue
        }
        k=(x/j)%10
        for i:=1000; y/i>=0; i=(i/10){
            if(y/i==0){
                continue
            }
            if (k==(y/i)%10){
                fmt.Print(k," ")
            }
            if i==1{
                break
            }
        }
        if j==1{
            break
        }
    }
}
→ Ссылка
Автор решения: Тима

Просто у первого числа берешь цифры с начала, а у другого с конца и выводишь цифру первого числа.

 package main
    import "fmt"
    func main(){
        var a, b, x , y int
        fmt.Scan(&a, &b)
        j:=10000
        for a > 0{
            x = a / j
            a = a % j
            y = b
            for y > 0 && x > 0{
                if y%10 == x {
                    fmt.Print(x, " ")
                    
                }
                y = y/10
            }
            j = j/10
        }
    }
→ Ссылка
Автор решения: Pak Uula

Чисто из общих соображений - если в задании не сказано, что нужно проверять достоверность ввода, то можно верить, что ввод всегда корректен. Следовательно, можно сканировать не числа, а строки, и верить, что эти строки будут именно числами. Тогда всё становится совсем просто. Достаточно считать две строки, и в цикле по символам первой строки проверять, входит ли строка во вторую.

package main

import (
    "fmt"
    "slices"
)

func main() {
    var a, b string
    fmt.Scan(&a, &b)
    b_runes := []rune(b)
    for _, c := range a {
        if slices.Contains(b_runes, c) {
            fmt.Print(string(c), " ")
        }
    }
    fmt.Println()
}

Если же хочется проверить корректность ввода, можно добавить что-то вроде такого:

func assertString(a string) {
    aInt, err := strconv.Atoi(a)
    if err != nil {
        fmt.Println("Not a number: ", a)
        os.Exit(1)
    }
    if aInt < 0 || aInt > 10000 {
        fmt.Println("Out of range: ", a)
        os.Exit(1)
    }
}
→ Ссылка