GoでOJを作ったときに遭遇した問題について

6281 ワード

GoでOJを作ったときに遭遇した問題について
全体的にojはc/c++で行うのに適しています.多くのojは彼らの入力サンプルの処理に完備しているからです.しかし、小衆言語Goにとって、そんなによくありません.あるいは、入力の処理方法は少し面倒です.また、このような入出力の気持ち悪い人を突っ込むojサイトは、最近leetcodeを塗って入出力を処理しないojに慣れているのかもしれません.
  • 牛客網のOJ入力では、よく問題が発生する
  • 複数組のデータ入力は、必ずfmtを処理する.Scanln()の戻り値、具体的な処理方法は以下の通りである:
    ...
    n,err:=fmt.Scanln()
    if n==0||err!=nil{
    	return //  break ,    
    }
    
    問題ソース:複数のデータの下で、その要求した入出力に従って実現したのに、0.00%が通過した問題に遭遇した.複数組のデータの下で、それに要求された入出力が実現されているのに、0.00%が通過する問題に直面している.解決:これは大半がGoの入力によるものであり、GoにはC/C++のEOF制御方式がないためfmtしか通過できない.Scanln()が返すパラメータ判定は,具体的には次のコードを参照する.
    package main
    import "fmt"
    func main(){
    	n:=0
    	_,_=fmt.Scanln(&n)//                 
    	for n>0{
    		a:=0
    		for n>2{
    			a+=n/3;n=n%3+n/3
    			if n==2{
    				n++
    			}
    		}
    		fmt.Println(a)
    		b,err:=fmt.Scanln(&n)
    		//            ,n==0,          ,             ,    oj ,        ;
    		//      ,    !!!               !  !
    		if b==0||err!=nil{
    			break
    		}
    	}
    }
    
  • 行入力には複数のデータが含まれている.すなわち、複数のスペース分割がある入力である.これもGoの入力がC scanf関数がEOF終了を返す処理方式とは異なり、処理上のトラブルを引き起こす.以下の解決方法
    import "bufio"
    ...
    reader:=bufio.NewReader(os.Stdin)
    n,err:=reader.ReadString("
    "
    ) if n==0||err!=nil{ return } bytes, _, _ := reader.ReadLine() // , str := string(bytes) fmt.Println(bytes) fmt.Println(str)
  • .