Не удается получить цикл для итерации достаточно времени, чтобы моя программа работала - PullRequest
2 голосов
/ 13 мая 2019

Я пытаюсь выполнить какое-то упражнение, которое наш профессор дал нам для подготовки к экзамену, но я застрял на довольно раздражающей проблеме.
В упражнении требуется два ввода, n и d, и программа должна найти наименьшее число, удалив d десятичных дробей из числа n. Проблема заключается в 40-й или 41-й строке, потому что я не знаю, как получить достаточно циклов, чтобы попробовать все возможные варианты. На данный момент, программа ограничена и не будет работать должным образом с большинством входов.

Пример ввода: 32751960 3
Ожидаемый результат: 21960 (это наименьшее число, которое мы можем получить, удалив 3 десятичных знака из первого числа)
Что я получаю: 31960

Заранее спасибо всем, кто хочет мне помочь.

Код:

package main

import (
    "fmt"
    "os"
    "bufio"
    "strconv"
    "strings"
    "math"
)

var (
    input string
    n, d, max int
    num, dec string
    in []int
)

func main (){
    getInput()
    max = n
    fmt.Println("Variables: ", n, d)

    //Check
    if d>len(num){
        fmt.Println(math.NaN())
        os.Exit(0)
    }

    //The problematic cicle
    for i:=d; i<=len(num); i++{ //On line 40 or 41 lies the problem: I don't get enough loops to check every possible combination,
                                //and at the same time i have to limit the i var to not exceed the slice boundaries
        temp := num[:i-d] + num[i:] 
        if temp == ""{ //To avoid blank strings
            continue
        }
        itemp, _ := strconv.Atoi(temp)
        fmt.Println(itemp)
        if itemp < max {
            max = itemp
        }

    }
    fmt.Println("Best number:",max)
}

func getInput(){
    scanner := bufio.NewScanner(os.Stdin)
    if scanner.Scan(){
        input = scanner.Text()
    }
    for _, s := range strings.Fields(input){
        i, err := strconv.Atoi(s)
        if err != nil {
            fmt.Println(err)
        }
        in = append(in, i) //
    }
    n = in[0] //main number
    d = in[1] //decimals to remove
    num = strconv.Itoa(n)
    dec = strconv.Itoa(d) 
}

1 Ответ

3 голосов
/ 13 мая 2019

Сначала нужно подумать об алгоритме.
И удаляемые цифры не кажутся смежными:
Здесь temp := num[:i-d] + num[i:] вы пытаетесь удалить 3 соседние цифры (для d=3) и вам следует попробоватьудалить также несмежные цифры.
Совет:
Удалить по одной цифре за раз (k): n = n[:k] + n[k+1:]


  1. Сначала для целей обучения, я рекомендую вампопробовать метод грубой силы: Сгенерируйте все возможные состояния и найдите наименьшее число среди них всех.

Для наименьшего числа левая цифра меньше правой цифры.
Удалите d несмежные цифры, затем найдите наименьшее число.Я рекомендую один цикл для d цифр:
for i := 0; i < d; i++ {
и другой цикл для нахождения позиции k для удаления:
for j := 0; j < k; j++ {.

Как это и это :

package main

import "fmt"

func main() {
    n := "32751960"
    d := 3
    // fmt.Scan(&n, &d)
    for i := 0; i < d; i++ {
        k := len(n) - 1
        for j := 0; j < k; j++ {
            if n[j] > n[j+1] {
                k = j
                break
            }
        }
        n = n[:k] + n[k+1:]
    }
    fmt.Println(n) // 21960
}

Использование 1 цикла, например this :
package main

import "fmt"

func main() {
    n := "322311"
    d := 3
    // fmt.Scan(&n, &d)
    for j := 0; j < len(n)-1; j++ {
        if n[j] > n[j+1] {
            n = n[:j] + n[j+1:]
            j = -1
            d--
            if d <= 0 {
                break
            }
        }
    }
    n = n[:len(n)-d]
    fmt.Println(n) // 211
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...