【Go言語】AtCoder ABC169 復習(問題A~問題D)

投稿者: | 2020年7月3日

みなさんこんにちは、ほむほむです。
今回はAtCoder Beginner Contest 169の問題A~問題Dまでの復習投稿です。

【問題A】
後ほど説明文を掲載します。

package main

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

func main() {
	list := getStdinIntArr()
	A := list[0]
	B := list[1]
	fmt.Printf("%d\n", A*B)
}

var sc = bufio.NewReaderSize(os.Stdin, 1024*1024*1)

func getStdin() string {
	return readLine()
}
func getStdinIntArr() []int {
	str := getStdin()
	list := strings.Split(str, " ")
	rtn := make([]int, len(list))
	for idx, val := range list {
		rtn[idx], _ = strconv.Atoi(val)
	}
	return rtn
}
func readLine() string {
	buf := make([]byte, 0, 0)
	for {
		l, p, _ := sc.ReadLine()
		buf = append(buf, l...)
		if !p {
			break
		}
	}
	return string(buf)
}


【問題B】
後ほど説明文を掲載します。

package main

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

func main() {
	N := getStdinInt()
	A := getStdinIntArr64()
	Abig := make([]*big.Int, N)
	for i := 0; i < N; i++ {
		Abig[i] = big.NewInt(A[i])
	}

	for i := 0; i < len(A); i++ {
		if A[i] == 0 {
			fmt.Printf("0\n")
			return
		}
		if A[i] > 1000000000000000000 {
			fmt.Printf("-1\n")
			return
		}
	}

	ans := big.NewInt(1)
	cmp := big.NewInt(1000000000000000000)
	for i := 0; i < len(Abig); i++ {
		ans = ans.Mul(ans, Abig[i])
		if ans.Cmp(cmp) == 1 {
			fmt.Printf("-1\n")
			return
		}
	}
	fmt.Printf("%s\n", fmt.Sprint(ans))
	fmt.Printf("\n")
}

var sc = bufio.NewReaderSize(os.Stdin, 1024*1024*10)

func getStdin() string {
	return readLine()
}
func getStdinInt() int {
	str := getStdin()
	rtn, _ := strconv.Atoi(str)
	return rtn
}
func getStdinIntArr64() []int64 {
	str := getStdin()
	list := strings.Split(str, " ")
	rtn := make([]int64, len(list))
	for idx, val := range list {
		rtn[idx], _ = strconv.ParseInt(val, 10, 64)
	}
	return rtn
}
func readLine() string {
	buf := make([]byte, 0, 0)
	for {
		l, p, _ := sc.ReadLine()
		buf = append(buf, l...)
		if !p {
			break
		}
	}
	return string(buf)
}


【問題C】
後ほど説明文を掲載します。

package main

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

func main() {
	list := getStdinArr()
	N, _ := strconv.Atoi(list[0])
	M, _ := strconv.ParseFloat(list[1], 64)
	n := N
	m := int(math.Round(M * 100))
	fmt.Printf("%d\n", (n*m)/100)
}

var sc = bufio.NewReaderSize(os.Stdin, 1024*1024*1)

func getStdin() string {
	return readLine()
}
func getStdinArr() []string {
	str := getStdin()
	list := strings.Split(str, " ")
	return list
}
func readLine() string {
	buf := make([]byte, 0, 0)
	for {
		l, p, _ := sc.ReadLine()
		buf = append(buf, l...)
		if !p {
			break
		}
	}
	return string(buf)
}


【問題D】
後ほど説明文を掲載します。

package main

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

func main() {
	N := getStdinInt64()
	Nori := N
	arr := make([]bool, int(math.Sqrt(float64(N)))+1)

	// 初期化
	for i := 2; i < len(arr); i++ {
		arr[i] = true
	}
	// 素数を求める
	arr[0] = false
	arr[1] = false
	for i := 2; i < len(arr); i++ {
		if arr[i] {
			for j := i * 2; j < len(arr); j += i {
				arr[j] = false
			}
		}
	}
	// 割り切れるか判別(素因数分解)
	cnt := 0
	var i int64
	for i = 2; int(i) < len(arr); i++ {
		if arr[i] && (N%i) == 0 {
			mul := i
			pow := 1
			for {
				if N%mul == 0 {
					cnt++
					N /= mul
					pow++
					mul = 1
					for n := 0; n < pow; n++ {
						mul *= i
					}
				} else {
					break
				}
			}
			if N <= 1 {
				break
			}
		}
	}
	// 素因数分解のあまり
	if N > 1 && int(N) > len(arr) {
		cnt++
	}

	if cnt == 0 && (Nori == 0 || Nori == 1) {
		fmt.Printf("%d\n", 0)
	} else if cnt == 0 {
		fmt.Printf("1\n")
	} else {
		fmt.Printf("%d\n", cnt)
	}
}

var sc = bufio.NewReaderSize(os.Stdin, 1024*1024*1)

func getStdin() string {
	return readLine()
}
func getStdinInt64() int64 {
	str := getStdin()
	rtn, _ := strconv.ParseInt(str, 10, 64)
	return rtn
}
func readLine() string {
	buf := make([]byte, 0, 0)
	for {
		l, p, _ := sc.ReadLine()
		buf = append(buf, l...)
		if !p {
			break
		}
	}
	return string(buf)
}

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください