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 шт):
- Перевести оба числа в строку и проверять наличие каждой цифры из первого числа во втором.
или
- Делать, как у вас, но заносить результат в массив, потом вывести массив в обратном порядке.
или
- Заносить каждую найденую цифру в строку с результатом, но присоединять не с конца, а с начала.
Можно создать функцию, которая "развернет" оба числа перед началом циклов. В этом способе есть косяк, что при реверсе числа, заканчивающегося на ноль, он этот ноль потеряет. Но для примера в задаче (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
}
Нужно с самого начала делать не обратный перебор:
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
}
}
Чисто из общих соображений - если в задании не сказано, что нужно проверять достоверность ввода, то можно верить, что ввод всегда корректен. Следовательно, можно сканировать не числа, а строки, и верить, что эти строки будут именно числами. Тогда всё становится совсем просто. Достаточно считать две строки, и в цикле по символам первой строки проверять, входит ли строка во вторую.
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)
}
}