面试题2

总体内容

编写程序,在终端输出九九乘法表

2、一个数如果恰好等于它的因子之和,这个数就是完数,如:6=1+2+3,变成找出1000以内的所有完数

3、输入一个字符串,判断是否为回文,回文字符串是指从左到右读和从右到左读完全相同的字符串

4、输入一行字符,分别统计出英文字母、空格、数字和其他字符的个数

5、计算两个大数相加的和,这两个大数会超过int64的范围

1、打印九九乘法表

package main

import(
   "fmt"
)

func multi(){
   for i:=0;i<9;i++{   //控制行数
      for j:=0;j<=i;j++{    //控制列数
         fmt.Printf("%d*%d=%d	",i+1,j+1,(i+1)*(j+1))
      }
      fmt.Println()
   }
}

func main(){
   multi()
}
D:project>go build go_dev/day4/work/jiujiu

D:project>jiujiu.exe
1*1=1
2*1=2   2*2=4
3*1=3   3*2=6   3*3=9
4*1=4   4*2=8   4*3=12  4*4=16
5*1=5   5*2=10  5*3=15  5*4=20  5*5=25
6*1=6   6*2=12  6*3=18  6*4=24  6*5=30  6*6=36
7*1=7   7*2=14  7*3=21  7*4=28  7*5=35  7*6=42  7*7=49
8*1=8   8*2=16  8*3=24  8*4=32  8*5=40  8*6=48  8*7=56  8*8=64
9*1=9   9*2=18  9*3=27  9*4=36  9*5=45  9*6=54  9*7=63  9*8=72  9*9=81

2、一个数如果恰好等于它的因子之和,这个 数就成之为完数。如6=1+2+3.找出1000以内所有完数

package main

import(
   "fmt"
)

func perfect(n int)bool{
   var sum int =0
   for i:=1;i<n;i++{  
      if n%i==0{
         sum+=i
      }
   }
   return n==sum
}

func process(n int) {//遍历输入的数
   for i:=1;i<n+1;i++{  //注意这里有个i++,也就是说如果输入1000,那么i的结果是1001
      if perfect(i){    //这里又是一种逻辑,所以可以单独区分出来
         fmt.Println(i)
      }
   }
}

func main(){
   var n int
   fmt.Scanf("%d",&n)
   process(n)
}
D:project>go build go_dev/day4/work/wanshu

D:project>wanshu.exe
1000
6
28
496
这个题目的思路:
首先遍历输入的 数,然后遍历遍历的数,让其满足与因数取余是否等于0

3、输入一个字符串,判断其是否是回文,回文字符串从左到右读和从右到左读完全一样的字符串

此题思路:首先获取输入的字符,然后把字符转化为字符列表,不是字节(因为中英文关系)然后进行遍历获取下标,进行取中判断,如果下标到中间,然后就退出,然后进行首尾下标值进行判断。
package main

import (
   "fmt"
)

func process(str string)bool{
   t:=[]rune(str) //把str转化为字符的列表
   length:=len(t)
   for i,_:=range t{
      if i==length/2{
         break
      }
      last:=length-i-1
      if t[i] != t[last]{
         return false
      }
   }
   return true
}

func main(){
   var str string
   fmt.Scanf("s",&str)
   if process(str){
      fmt.Println("yes")
   }else{
      fmt.Println("no")
   }
}
D:project>go build go_dev/day4/work/huiwen

D:project>huiwen.exe
131abc啊啊cba131
yes

4、输入一行字符,分别统计其中英文字母、空格、数字和其他字符的个数 

package main

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

func count(str string)(worldcount,spacecount,numbercount,othercount int){
   t:=[]rune(str)
   for _,v:=range t{
      switch{
      case v>='a'&&v<='z':
         fallthrough
      case v>='A'&& v<='Z':
         worldcount++
      case v== ' ' :
         spacecount++
      case v>='0'&&v<='9':
         numbercount++
      default:
         othercount++
      }
   }
   return
}

func main(){  //注意字符都是单引号
   reader:=bufio.NewReader(os.Stdin)  //把标准输入通过接口到缓冲区
   result,_,err:=reader.ReadLine()  //读取结果,bool,错误处理
   if err!=nil{
      fmt.Println("read from console err:",err)
      return
   }
   wc,sc,nc,oc:=count(string(result))
   fmt.Printf("word:%d
 space:%d
 number:%d
 other:%d
",wc,sc,nc,oc)
}
D:project>go build go_dev/day4/work/tongji

D:project>tongji.exe
123
word:0
 space:0
 number:3
 other:0

  

重点

5、计算两个大数相加的和。这两个大数会超过int64的表示范围

package main

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

func multi(str1, str2 string) (result string) {

   if len(str1) == 0 && len(str2) == 0 {  //都等于0的时候退出
      result = "0"
      return
   }

   var index1 = len(str1) - 1             //获取最大的下标
   var index2 = len(str2) - 1
   var left int                           //表示逢10进一

   //遍历最小的串
   for index1 >= 0 && index2 >= 0 {  //这里遍历,两个字符末尾相加。遍历最小的串
      c1 := str1[index1] - '0'   //0表示50,9表示50在assci中,相减刚好得到数字
      c2 := str2[index2] - '0'

      sum := int(c1) + int(c2) + left  //注意这里要转换成整形
      if sum >= 10 {
         left = 1
      } else {
         left = 0
      }
      c3 := (sum % 10) + '0'            //取余,这里回归assci表示的字符
      result = fmt.Sprintf("%c%s", c3, result)//这里第二个参数是接口
      index1--
      index2--
   }

   //下面两个for循环是来判断两个字符串字符多的那个字符串的操作
   for index1 >= 0 {
      c1 := str1[index1] - '0'
      sum := int(c1) + left
      if sum >= 10 {
         left = 1
      } else {
         left = 0
      }
      c3 := (sum % 10) + '0'

      result = fmt.Sprintf("%c%s", c3, result)
      index1--
   }

   for index2 >= 0 {
      c1 := str2[index2] - '0'
      sum := int(c1) + left
      if sum >= 10 {
         left = 1
      } else {
         left = 0
      }
      c3 := (sum % 10) + '0'
      result = fmt.Sprintf("%c%s", c3, result) //%c是格式化unicode表示字符
      index2--
   }

   //下面的if是判断,如果两个字符串相加之后比如99和1,这两个相加,那么就会变成100,也就是说到最后left还等于1的时候就是这种情况
   if left == 1 {
      result = fmt.Sprintf("1%s", result)
   }
   return
}

func main() {
   reader := bufio.NewReader(os.Stdin)
   result, _, err := reader.ReadLine()
   if err != nil {
      fmt.Println("read from console err:", err)
      return
   }

   strSlice := strings.Split(string(result), "+")  //切片
   if len(strSlice) != 2 {
      fmt.Println("please input a+b")
      return
   }

   strNumber1 := strings.TrimSpace(strSlice[0])
   strNumber2 := strings.TrimSpace(strSlice[1])
   fmt.Println(multi(strNumber1, strNumber2))
}

  

原文地址:https://www.cnblogs.com/pyrene/p/8094228.html