ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

golang重定向输入输出办法(算法竞赛向)

2022-06-07 17:34:54  阅读:218  来源: 互联网

标签:tmp 重定向 fmt 输入输出 tot golang io ans


本来是想用golang,因为这是工作中的主要语言,不妨试一试打cf,结果写了一题就被劝退了,golang对于打算法竞赛极不友好

首先,golang在cf中,fmt的各种scanf和printf并不直接接收来自于标准输入输出流的内容,所以有些oj由于没有做对STD IO的支持,golang提交上去就报CE,很恶心

其次,golang里面缺乏很多基本的数据结构,比如set,map也只是单纯的hash实现,效率并不高,所有的东西还需要专门make

而且,golang的类型比较固定,就是说,int无法和long long类型进行运算,虽然这个习惯并不好,但是如果强行cast需要很多代码量,麻烦得很,增加了很多代码量

但是偶尔找个乐子还是可以的

于是乎专门搞了套模板,本来以为golang这种语言有类似于freopen这种东西,结果发现没有,只能用fopen打开,因为golang自带err这个参数,所以直接判断是否成功打开这个文件作为判断oj还是本地,

实现类似功能

功能

1. 支持标准输入输出

2. 支持本地文件流测试

3. 无需更改即可提交oj

package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

func solve(in *bufio.Reader, out io.Writer) {
	var x uint
	fmt.Fscan(in, &x)
	tmp := x
	tot := 0
	for tmp != 0 {
		if (tmp & 1) != 0 {
			tot++
		}
		tmp >>= 1
	}
	ans := uint(0)
	for i := 0; i <= 30; i++ {
		var p uint
		p = uint(1 << uint(i))
		if (p&x) > 0 && tot > 1 {
			fmt.Fprintln(out, p)
			return
		}
		if (p&x) == 0 && ans == uint(0) {
			ans |= p
		}
		if (p & x) != 0 {
			tot -= 1
		}
	}
	for i := 0; i <= 30; i++ {
		var p uint
		p = uint(1 << uint(i))
		if (p & x) > 0 {
			ans |= p
			fmt.Fprintln(out, ans)

			return
		}
	}

}
func run(_r io.Reader, out io.Writer) {
	in := bufio.NewReader(_r)
	var kase int
	fmt.Fscan(in, &kase)
	for mmm := 1; mmm <= kase; mmm++ {
		solve(in, out)
	}
}

func main() {

	file, err := os.Open("C:\\Users\\tiany\\GolandProjects\\awesomeProject\\data.txt")
	if err != nil {
		file = os.Stdin
	}
	run(file, os.Stdout)

}

  

标签:tmp,重定向,fmt,输入输出,tot,golang,io,ans
来源: https://www.cnblogs.com/tiany7/p/16352699.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有