C#学习第七天10.8

129 阅读1分钟

一、输入一串单词判断能组成basketball几遍并输出

    Console.WriteLine("请输入一串单词");
   string str = Console.ReadLine();//定义一个字符串str(是输入的)
   //创建一个数组存储字母输出的次数,int数组只有长度的话,值默认都是0
         int[] count = new int[7];//ba(ba)sketl(l)
         //遍历数组
         for (int i = 0; i < str.Length; i++)//取字符串中的字母
         {

           switch (str[i])//字符串可以像数组一样直接取值(所以不需要变为数组),但是不能改变,
             {
                 //把每个字母出现的次数放在对应下标里面
                 case 'b':
                     ++count[0];//记录b 的数量
                     break;
                 case 'a':
                     ++count[1];//记录a 的数量
                     break;
                 case 's':
                     ++count[2];//记录s 的数量
                     break;
                 case 'k':
                     ++count[3];//记录k 的数量
                     break;
                 case 'e':
                     ++count[4];//记录e 的数量
                     break;
                 case 't':
                     ++count[5];//记录t 的数量
                     break;
                 case 'l':
                     ++count[6];//记录l 的数量
                     break;
             }
          }
         count[0] /= 2;//0是记录b的数量,因为b需要使用两次,所以需要/2
         count[1] /= 2;//a
         count[6] /= 2;//l
         //求出最小值(在其他字母都满足时,s3个k10个,还是只能拼成3个,所以需要输出最小值)
         int mincount = count.Min();
         Console.WriteLine(mincount);
         

二、封装函数

1、判断一个数是否是真素数(正反都是素数)

         //首先封装一个函数,判断是否是素数,再将这个数字逆转,再判断是不是素数
          //创建一个函数判断是不是素数
            static bool isPrime(int num)
            {
                //判断是不是素数并返回结果
                for(int i = 2;i < num; i++)
                {
                    if (num % i == 0)//从2开始一直到数本身,存在一个能被该数整除的数,所以不是素数,需要直接false
                      return false;
                }
                return true;
            }
          //创建一个函数,将数反转,字符串-》数组,数组反转-》字符串
            static int getReverse(string strNum)
            {
                string strNum2 = "";
              //使用循环,遍历每个字符没在逆序输出(使用需要两个字符串)
              for(int i = strNum.Length-1;i>= 0; i--)//strNum是输入的字符串,将他逆序输入到strNum2中,
                {
                   strNum2 += strNum[i];
                }
                return Convert.ToInt32(strNum2);//将字符串变为int类型
            }
            int M = Convert.ToInt32(Console.ReadLine());
            int N = Convert.ToInt32(Console.ReadLine());
            string strNum3 = "";//空字符串,用来存储真素数
            //循环遍历
            for(int i = M; i <= N; i++)
            {
                if (isPrime(i) && isPrime(getReverse(Convert.ToString(i))))
                {
                    if (strNum3 == "")//为空说明是第一个真素数直接写入
                    {  
                        strNum3 += i;
                    }
                    else
                    {
                        strNum3 += "," + i;//从第二个开始就需要用逗号连接
                    }
                }
            }
            Console.Write(strNum3);

2、定义一个函数getDivisor,输出一个数的所有因数,

static void getDivisor(int str)
 {
     string str2 = "";
     for (int i = 1; i <= str; i++)
     {
         if (str % i == 0)
         {
             if (str2 == "")
             {
                 str2 += i;
             }
             else
             {
                 str2 += "," + i;
             }
         }
     }
     Console.WriteLine(str2);
 }
 getDivisor(Convert.ToInt32(Console.ReadLine()));//将输入的数传入方法内

三、递归函数

1、输入n求出n项的斐波那契数列(后面数是前两个数的和)

 static int  fib(int num)//num是项数
{
    //出口
    if(num==1||num==2)return 1;//知道第一项和第二项是1,1就可以推出后面n项
    //关系式
    return fib(num - 1) + fib(num - 2);
}
int num=Convert.ToInt32(Console.ReadLine());
//num项
for(int i = 1; i <= num; i++)
{
    Console.Write(fib(i)+" ");
}

2、有关系式,11+22+....+k*k<2000,编一个程序,求满足此关系的k的最大值

//求关系式:
//f(k)=1*1+2*2+...k*k-->f(k-1)=1*1+2*2+...k-1*k-1-->f(k)=f(k-1)+k*k
//出口
//k=1返回1因为k=1时没有f(k-1)
    static int  Max(int num)//1--num的平方和
    {
        if (num==1) return 1;
        return Max(num - 1) + (num * num);
    }
    int num=1;
    while (true)
    {
        if (Max(num) >= 2000)
        {
            break;
        }
        num++;
    }
    Console.WriteLine(num - 1);

3、第一天摘n个桃子,当时就吃了一半,又多吃一个,第二天又一半加一个,到第十天就只剩一个了,问第一天摘了几个,并且打印每天剩下的桃子数

//关系式逆推f(n)=(f(n+1)+1)*2,
//出口f(10)=1;
static int getNum(int num)
    {
        if (num == 10) return 1;
        return (getNum(num + 1) + 1) * 2;
    }
Console.WriteLine("第一到十天的桃子数分别是:{0},{1},{2},{3},{4},{5},{6},{7},{8},{9}", getNum(1), getNum(2), getNum(3), getNum(4), getNum(5), getNum(6), getNum(7), getNum(8), getNum(9), getNum(10));