C#经典算法

本文涵盖C#编程基础,包括质数判断、数列求解、排序算法(冒泡和选择)、阶乘计算、数组操作、随机数生成、字符串反转、集合去重、竞赛逻辑分析、游戏分数计算、日期天数计算、百鸡问题和对折问题。通过实例演示了多种信息技术领域的关键知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

1.求质数

2.有一列数1,1,2,3,5,........求第30个数

3.冒泡排序

4.请编写一个函数,能够计算10以内数的阶乘,尽量采用递归算法。(10!=3628800)。

5. 请编程实现此方法。将输入的整型数组,合并转换为逗号分隔的字符串。

6.产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。

7.请将字符串"I am a student"按单词逆序输出 如"student a am I"

8.C# 取两个数组的相同元素

9.有一个字符串 "I am a good man",设计一个函数,返回 "man good a am I"。

10.有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

11.产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。

12.用C#写一段选择排序算法,要求用自己的编程风格。

13.有一个10个数的数组,计算其中不重复数字的个数。{3,5,9,8,10,5,3},用HashSet。

14. A、B、C、D、E五名学生有可能参加计算机竞赛,根据下列条件判断哪些人参加了竞赛:

15.程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。

16.写一个冒泡排序

17. 写一个选择排序

18.一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少,用递归算法实现。

19.一个游戏,前20关是每一关自身的分数,1-30关每一关是10分,31-40关,每一关是20分,1-49关,每一关是30分,第50关是100分,输入你现在闯到的关卡数,求你现在拥有的分数。利用for嵌套if。

20.输入月份和日期,输出是今年的第多少天。(2月按照28天计算)利用switch case。

21..百鸡百钱:公鸡2文钱一只,母鸡1文钱一只,小鸡半文钱一只,总共只有100文钱,如何在凑够100只鸡的情况下刚好花完100文钱?利用for嵌套+if筛选。

22.纸张可以无限次对折,纸张厚度为0.07毫米。问多少次对折至少可以超过8848?利用while。

参考:

1.求质数

质数也成为素数,质数就是这个数除了1和他本身两个因数以外,没有其他因数的数,叫做质数,和他相反的是合数,

就是除了1和他本身两个因数以外,还友其他因数的数叫做合数。

  //以下为函数部分
      static void cal(long x)
      {
           long sum = 1;
           byte row = 1;
           Console.Write("\n");
           for (long a = 3; a < x + 1; a++)
           {
              bool flag = true;
               for (long b = 2; b < (a / 2) + 1; b++)
               {
                   if (a % b != 0) continue;
                   flag = false;
                   break;
               }
                if (flag)
                {
                   if (row == 10) { Console.WriteLine(); row = 0; }
                   if (sum == 1) Console.Write("{0,7}", 2);
                   Console.Write("{0,7}", a);
                   sum++; row++;
                }
            }
            Console.WriteLine("\n\n{0} 以内共有 {1} 个质数\n", x, sum);
       }

 

2.有一列数1,1,2,3,5,........求第30个数

public static int Foo(int i)
    {
       if (i <= 0)
            return 0;
       else if (i > 0 && i <= 2)
            return 1;
       else
            return  Foo(i - 1) + Foo(i - 2);
    }

3.冒泡排序

//冒泡排序类
 public class sorter
 {
       public void Sort(int[] list)
       {
           int i, j, temp;
           bool done = false;
           j = 1;
           while ((j < list.Length) && (!done))
           {
               done = true;
               for (i = 0; i < list.Length - j; i++)
               {
                   if (list[i] > list[i + 1])
                   {
                       done = false;
                       temp = list[i];
                       list[i] = list[i + 1];
                       list[i + 1] = temp;
                   }
               }
               j++;
           }
       }
   }

4.请编写一个函数,能够计算10以内数的阶乘,尽量采用递归算法。(10!=3628800)。

public int jiecheng(int n)
{
       if (n == 1)
          return 1;
       else if (n == 2)
           return 2;
        else
           return n * jiecheng(n - 1);
}

5 请编程实现此方法。将输入的整型数组,合并转换为逗号分隔的字符串。

例如输入参数为整型数组{9,7,2},那么输出结果为字符串"9,7,2"。

private static string Combine(int[] data)
  {
      string str = "";
      foreach (int s in data)
      {
           str += s.ToString() + ",";
      }
      return str;
  }

6.产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。

//产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
            int[] arr = new int[100];
            ArrayList myList = new ArrayList();
            Random rad = new Random();
            while (myList.Count < 100)
            {
                int num = rad.Next(1, 101);
                if (!myList.Contains(num))
                {
                    myList.Add(num);
                }
            }
            for (int i = 0; i < 100; i++)
            {
                arr[i] = (int)myList[i];
            }
            for (int i = 0; i < arr.Length; i++)
            {
                Console.Write(arr[i] + ",");
            }
            Console.ReadKey();

7.请将字符串"I am a student"按单词逆序输出 如"student a am I"

string S = "I am a student";
char[] C = new char[] { ' '};
string[] n =S.Split(C);
int length = S.Length;
for (int i =length-1 ; i >=0; i--)
{
        Console.Write(n[i]);
        if (i != 0)
        {
            Console.Write(" ");
        }
}

8.C# 取两个数组的相同元素

摘要: 以往我们都是肯定绞尽脑汁,肯定什么循环,元素大小,什么因素都考虑进去。但是现在采用Linq可以很好的解决这个问题。找出两个或多个数组的相同项。代码如下:

usingSystem;
 usingSystem.Collections.Generic;
 usingSystem.Linq;
 usingSystem.Text;
 namespaceTest4_03
 {
    classProgram
     {
        staticvoidMain(string[] args)
         {
            string[] names = {"Adams","Arthur","Buchanan","Tsbuchis","ShCian","FuchsiaLinda","DecheChen","Lotheer","FindLanciCade",
            "SorchLand","JiangZheng","MisiiLoda","Gtod","Dfac","Lama","BakCades","Losangle","ZheWQ","GehengDahaLothi","ToryLandey",
            "DakaLothy","BthLanda","MenNorth","Fith","FoxMain","DontM","Saobba","Del","Sala","Ghero","BhthLaPhda"};
            IEnumerable<string> skip = names.Skip(10);
            IEnumerable<string> take = names.Take(11);
            //取出两个序列中交集部分,按理论应该输出JiangZheng
            IEnumerable<string> intersect = skip.Intersect(take);
            foreach(varsinintersect)
             {
                Console.WriteLine(s);
             }
            Console.ReadKey();
         }
     }
 }

9.有一个字符串 "I am a good man",设计一个函数,返回 "man good a am I"。

static string Reverse()    
         {    
             string s = "I am a good man";    
             string[] arr = s.Split(' ');    
             string res = "";    
             for (int i = arr.Length - 1; i >= 0; i--)    
             {    
                 res += arr[i];    
                 if (i > 0)    
                     res += " ";    
             }    
             return res;    
         }

10.有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

class Program    
   {    
       static void Main(string[] args)    
       {    
       
           //有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?    
           //分解题目    
           //条件:四个数字1、2、3、4  ;三位数:百位、十位、个位    
           //要求:互不相同;无重复数字:每个数字在三位中只出现一次    
           //结果:多少个? 都是多少?    
       
           int count = 0; //统计个数    
           for (int bw = 1; bw <= 4; bw++)    
           {    
               for (int sw = 1; sw <= 4; sw++)    
               {    
                   if (sw!= bw)  //很显然,只有百位和十位不同的情况下才能谈个位。    
                   {    
                       for (int gw = 1; gw <= 4; gw++)    
                       {    
                           if (gw != sw && gw != bw)   //百位用过的,十位就不能用;百位和十位都用过的,个位就不能用    
                           {    
                               count++;    
                               Console.WriteLine("{0}{1}{2}", bw, sw, gw);    
                           }    
                       }    
                   }    
               }    
           }    
           Console.WriteLine("一共有{0}个", count);    
           Console.Read();    
       
       }    
   }

11.产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。

int[] intArr=new int[100];
ArrayList myList=new ArrayList();
Random rnd=new Random();
while(myList.Count<100)
{
int num=rnd.Next(1,101);
if(!myList.Contains(num))
myList.Add(num);
}
for(int i=0;i<100;i++)
intArr[i]=(int)myList[i];

12.用C#写一段选择排序算法,要求用自己的编程风格。

public void xuanZhe(int[] list)//选择排序
{
for (int i = 0; i < list.Length – 1; i++)
{
min = i;
for (int j = i + 1; j < list.Length; j++)
{
if (list[j] < list[min])
min = j;
}
int t = list[min];
list[min] = list[i];
list[i] = t;
}
}

13.有一个10个数的数组,计算其中不重复数字的个数。{3,5,9,8,10,5,3},用HashSet。

int[] values = { 3, 5, 9, 8, 10, 5, 3 };
HashSet<int> set = new HashSet<int>();
foreach (int i in values)
{
set.Add(i);
}
foreach (int i in set)
{
Console.WriteLine(i);
}

14. A、B、C、D、E五名学生有可能参加计算机竞赛,根据下列条件判断哪些人参加了竞赛:

(1)A参加时,B也参加;

(2)B和C只有一个人参加;

(3)C和D或者都参加,或者都不参加;

(4)D和E中至少有一个人参加;

(5)如果E参加,那么A和D也都参加。

static void Main(string[] args)
{
  char[] name={'A','B','C','D','E'};
  int[] value = new int[5];
  for (value[0]=0;value[0]<2;value [0]++)
 for (value[1]=0; value[1] < 2; value[1]++)
   for (value[2]=0; value[2] < 2; value[2]++)
 for (value[3]=0; value[3] < 2; value[3]++)
   for (value[4]=0; value[4] < 2; value[4]++)
   {
  if ((value[1] >= value[0]) && (value[1] + value[2] == 1) && (value[2] == value[3]) && (value[3] + value[4]==1) && (value[4]==0 || value[4]==1 && value[0]==1 && value[3]==1))
  {
    for (int i = 0; i < 5; i++)
    {
  if (value[i]==1)
  {
    Console.WriteLine("{0}参加", name[i]);
  }
  else
  {
    Console.WriteLine("{0}不参加", name[i]);
  }
    }
  }
   }
}

15.程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。

  public delegate void SubEventHandler(); 
  public abstract class Subject 
  { 
    public event SubEventHandler SubEvent; 
    protected void FireAway() 
    { 
      if (this.SubEvent != null) 
        this.SubEvent(); 
    }  
  } 
  public class Cat : Subject 
  { 
    public void Cry() 
    { 
      Console.WriteLine(cat cryed.); 
      this.FireAway(); 
    } 
  } 
  public abstract class Observer 
  { 
    public Observer(Subject sub) 
    { 
      sub.SubEvent += new SubEventHandler(Response); 
    } 
    public abstract void Response();  
  } 
  public class Mouse : Observer 
  { 
    private string name; 
    public Mouse(string name, Subject sub) : base(sub) 
    {  
      this.name = name; 
    } 
    public override void Response() 
    { 
      Console.WriteLine(name + attempt to escape!); 
    } 
  } 
  public class Master : Observer 
  { 
    public Master(Subject sub) : base(sub){} 
    public override void Response() 
    { 
      Console.WriteLine(host waken); 
    } 
  } 
  class Class1 
  { 
    static void Main(string[] args) 
    { 
      Cat cat = new Cat(); 
      Mouse mouse1 = new Mouse(mouse1, cat); 
      Mouse mouse2 = new Mouse(mouse2, cat); 
      Master master = new Master(cat); 
      cat.Cry(); 
    } 
  } 


16.写一个冒泡排序

  public class bubblesorter
  {
    public void sort(int[] list)
    {
      int i, j, temp;
      bool done = false;
      j = 1;
      while ((j < list.Length) && (!done))
      {
        done = true;
        for (i = 0; i < list.Length - j; i++)
        {
          if (list[i] > list[i + 1])
          {
            done = false;
            temp = list[i];
            list[i] = list[i + 1];
            list[i + 1] = temp;
          }
        }
          j++;
      }
    }
  }

17. 写一个选择排序

  public class selectionsorter
  {
    private int min;
    public void sort(int[] list)
    {
      for (int i = 0; i < list.Length - 1; i++)
      {
        min = i;
        for (int j = i + 1; j < list.Length; j++)
        {
          if (list[j] < list[min])
            min = j;
        }
        int t = list[min];
        list[min] = list[i];
        list[i] = t;
      }
    }
  }

18.一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少,用递归算法实现。

public class MainClass
{
  public static void Main()
  {  
    Console.WriteLine(Foo(30));
  }
  public static int Foo(int i)
  {
    if (i <= 0)
      return 0;
    else if(i > 0 && i <= 2)
      return 1;
    else return Foo(i -1) + Foo(i - 2);
  }
}

19.一个游戏,前20关是每一关自身的分数,1-30关每一关是10分,31-40关,每一关是20分,1-49关,每一关是30分,第50关是100分,输入你现在闯到的关卡数,求你现在拥有的分数。利用for嵌套if。

 Console.Write("输入你闯的关卡数:");
            int a = int.Parse(Console.ReadLine());
            sum = 0;
            for (int i = 1; i <= a;i++ )
            {
                if(i>=1&&i<=20)
                {
                    sum += i;
                }
                else if(i>=21&&i<=30)
                {
                    sum += 10;
                }
                else if(i>=31&&i<=40)
                {
                    sum += 20;
                }
                else if (i >= 41 && i <= 49)
                {
                    sum += 30;
                }
                else
                {
                    sum += 100;
                }
            }
Console.WriteLine("总分为:" + sum);

20.输入月份和日期,输出是今年的第多少天。(2月按照28天计算)利用switch case。

          int sum = 0;
            int m1 = 31, m2 = 28, m3 = 31, m4 = 30, m5 = 31, m6 = 30, m7 = 31, m8 = 31, m9 = 30, m10 = 31, m11 = 30;
            Console.Write("请输入月份:");
            int m = int.Parse(Console.ReadLine());
            Console.Write("请输入几号:");
            int d = int.Parse(Console.ReadLine());
            switch(m)
            {
                case 1:
                    sum = d;
                    break;
                case 2:
                    sum = m1 + d;
                    break;
                case 3:
                    sum = m1 + m2 + d;
                    break;
                case 4:
                    sum = m1 + m2 +m3+ d;
                    break;
                case 5:
                    sum = m1 + m2 + m3 +m4+ d;
                    break;
                case 6:
                    sum = m1 + m2 + m3 + m4+m5 + d;
                    break;
                case 7:
                    sum = m1 + m2 + m3 + m4 + m5+m6 + d;
                    break;
                case 8:
                    sum = m1 + m2 + m3 + m4 + m5 + m6+m7 + d;
                    break;
                case 9:
                    sum = m1 + m2 + m3 + m4 + m5 + m6 + m7+m8 + d;
                    break;
                case 10:
                    sum = m1 + m2 + m3 + m4 + m5 + m6 + m7 + m8+m9 + d;
                    break;
                case 11:
                    sum = m1 + m2 + m3 + m4 + m5 + m6 + m7 + m8 + m9+m10 + d;
                    break;
                case 12:
                    sum = m1 + m2 + m3 + m4 + m5 + m6 + m7 + m8 + m9 + m10+m11 + d;
                    break;
            }
            Console.WriteLine("今年的第" +sum+ "天");

21..百鸡百钱:公鸡2文钱一只,母鸡1文钱一只,小鸡半文钱一只,总共只有100文钱,如何在凑够100只鸡的情况下刚好花完100文钱?利用for嵌套+if筛选。

       int sum = 0;
            for (int x = 0; x <= 50;x++ )
            {
                for (int y = 0; y <= 100;y++ )
                {
                    for (int z = 0; z <= 200;z++ )
                    {
                        if(x+y+z==100&&2*x+y+0.5*z==100)
                        {
                            sum++;
                            Console.WriteLine("第"+sum+"种方法:"+x+"只公鸡,"+y+"只母鸡,"+z+"只小鸡。");
                        }
                    }
                }
            }
            Console.WriteLine("共有" + sum + "中方法。");

22.纸张可以无限次对折,纸张厚度为0.07毫米。问多少次对折至少可以超过8848?利用while。

         int a = 7, b = 884800000;
         int i=1;
         while(true)
         {
                a*=2;
                if(a>=b)
                {
                    Console.WriteLine("第"+i+"次折叠。");
                    Console.WriteLine("高度为"+a);
                    break;
                }
                i++;
            }

本帖转自:22道C#基础练习题 - 知乎 (zhihu.com) 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值