【Go语言入门150题】L1-005 考试座位号 (15 分) L1-006 连续因子 (20 分)

274 阅读2分钟

这是我参与8月更文挑战的第 25 天,活动详情查看: 8月更文挑战

L1-005 考试座位号 (15 分) Go语言|Golang

每个 PAT 考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。但有些考生迟到了,试机已经结束,他们只能拿着领到的试机座位号码求助于你,从后台查出他们的考试座位号码。

输入格式:

输入第一行给出一个正整数 N(≤1000),随后 N 行,每行给出一个考生的信息:准考证号 试机座位号 考试座位号。其中准考证号由 16 位数字组成,座位从 1 到 N 编号。输入保证每个人的准考证号都不同,并且任何时候都不会把两个人分配到同一个座位上。

考生信息之后,给出一个正整数 M(≤N),随后一行中给出 M 个待查询的试机座位号码,以空格分隔。

输出格式:

对应每个需要查询的试机座位号码,在一行中输出对应考生的准考证号和考试座位号码,中间用 1 个空格分隔。

输入样例:

4
3310120150912233 2 4
3310120150912119 4 1
3310120150912126 1 3
3310120150912002 3 2
2
3 4

结尾无空行

输出样例:

3310120150912002 2
3310120150912119 1

结尾无空行

思路:

基础的循环语句。 注意:

  1. for循环的两种形式
for index,item := range info{}
for i:=0; i<M; i++{}
  1. 因为要存储的数字太大了,怕数组会存不下,所以用字符串数组存,所以会用到一个类型的转换来进行下一步的判断操作。 stringint
strconv.Itoa(s)//int to string 
strconv.Atoi(s)//string to int

代码如下:

package main

import (
	"fmt"
	"strconv"
)

func main() {
	var F int
	var M int
	_,_ = fmt.Scan(&F)
	var info [1001][3]string
	for i:=0;i<F;i++{
		_,_ = fmt.Scan(&info[i][0],&info[i][1],&info[i][2])
	}
	_,_ = fmt.Scan(&M)
	for i:=0; i<M; i++{
		var s int
		_,_=fmt.Scan(&s)
		for _,item := range info{
			if item[1] == strconv.Itoa(s)  {
				fmt.Printf("%s %s\n",item[0],item[2])
			}
		}
	}
}

L1-006 连续因子 (20 分) Go语言|Golang

一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。

输入格式:

输入在一行中给出一个正整数 N(1<N<2e31)

输出格式:

首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1因子2……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。

输入样例:

630

结尾无空行

输出样例:

3
5*6*7

结尾无空行

思路:

因为是连续的,所以我们只需找到第一个数字就行了,不过要记录一下一共有多少个这样的连续数字。最后连环输出就可以了。

但是!!!我只拿了18分。。。呜呜呜。。希望能有大佬帮我看看为啥我第四个测试点过不了。。

代码如下:

package main

import (
	"fmt"
	"math"
)

func main() {
	var N int
	var tmp int
	length := 0
	first := 0
	_,_ = fmt.Scan(&N)
	for i := 2; i <= int(math.Sqrt(float64(N)))+1; i++ { 	// 使用开方,减少循环次数,注意类型的
		var j int
		tmp = 1
		for j=i ; j<=int(math.Sqrt(float64(N)))+1; j++ { 	// 使用开方,减少循环次数,注意类型的
			tmp *= j
			if N % tmp!=0 {
				break
			}
			if j-i>length {
				length  = j-i
				first = i
			}
		}
	}
	if first == 0 {  		//特殊情况的考虑
		fmt.Printf("1\n%d",N)
	}else{
		fmt.Printf("%d",length +1)
		fmt.Printf("\n%d",first)
		for i := 1;i<=length ; i++ {
			fmt.Printf("*%d",first+i)
		}
	}
}