使用C#解决编程题一

还记得大一时练习ACM算法的时光,那时候解题用的是c和c++,最近想练练编程算法,但是c和c++好久没用了,很多地方生疏了。鉴于此,我准备用C#来写写代码。

进制转换

第一行:A进制和B进制(2<=A,B<=30)
第二行:A进制的数值num
要   求 :将A进制的num转为B进制数输出

代码:

//输入A和B进制和数值
string AtoB = Console.ReadLine();
string num = Console.ReadLine();
//得到A、B进制和数值
string[] atob = AtoB.Split(' ');
int A = Convert.ToInt32(atob[0]);
int B = Convert.ToInt32(atob[1]);
char[] c = num.ToArray();
//将A进制转为10进制
int x = 0;
double sum = 0;
for(int i=c.Length -1;i>=0;i--, x++)
{
    if (c[i] >= 'A')
    {
        sum += (c[i] - 'A' + 10) * Math.Pow(A, x);
    }
    else
    {
        sum += (c[i] - '0') * Math.Pow(A, x);
    }
}

//将10进制转为B进制
int temp = (int)sum;
List<double> result = new List<double>();
while(temp!=0)
{
    result.Add(temp % B);
    temp /= B;
}
result.Reverse();
foreach (double item in result)
{
    Console.Write(item);
}
Console.WriteLine();
//Console.ReadKey();

字符串匹配

第一行:输入字符串a
第二行:输入字符串b
要 求 :输出a中b的个数,以及b在a中的起始下标

例:
输入:
abcdabcacabce
abc
输出:
count:3
indexs:0 4 9

//字符串匹配找KMP
int[] Next(string T)
{
    int [] next=new int[T.Length];
    int k=-1;
    int j=0;
    next[j]=k;
    while(j < T.Length-1)
    {
        if(k==-1||T[j]==T[k])
        {
            next[++j]=++k;
        }
        else
        {
            k = next[k];
        }
    }
    return next;
}

void KMP(string a, string b ,out int count ,out List<int> indexs)
{
    int[] next = Next(b);
    int i = 0, j = 0;
    count = 0;
    indexs = new List<int>();
    while (i < a.Length)
    {
        if (j == -1 || a[i] == a[j])
        {
            i++; j++;
        }
        else
        {
            j = next[j];
        }

        if (j == b.Length)
        {
            count++;
            indexs.Add(i - b.Length + 1);
            j = 0;
        }
    }
}

string str1 = Console.ReadLine();
string str2 = Console.ReadLine();
int count;
List<int>indexs;
KMP(str1 , str2 ,out count ,out indexs);
Console.WriteLine("Count:{0}",count);
Console.Write("indexs:");
foreach(var item in indexs)
{
    Console.Write(item+" ");
}
Console.WriteLine();
//Console.ReadKey();

另一种做法:

void Func(string a,string b,out int count,out List<int> indexs)
{
    int i=0,j=0;
    count = 0;
    indexs = new List<int>();
    while(iif (a[i] == b[j])
        {                   
            if (j == (b.Length - 1))
            {
                count++;
                indexs.Add(i - b.Length + 1);                        
            }
            i++; 
            if(j<(b.Length-1))
            {
                j++;
            }
            else
            {
                j = 0;
            }                 
        }
        else
        {
            i++; j = 0;
        }
    }
}

阶乘和

输入:一个int类型的值n
:n的阶乘和

int n = Convert.ToInt32(Console.ReadLine());
int sum = 0, temp = 1;
for(int i=1;i<=n;i++)
{
    temp = temp * i;
    sum += temp;
}
Console.WriteLine(sum);

判断完数

void JudgeWanShu(int num)
{
    int sum = 0;
    int k = 1;
    for (int i = 1; i < num; i++)
    {
        if (num % i == 0)
        {
            sum += i;
        }
    }
    if (num == sum)
    {
        Console.Write("{0} its factors are ", num);
        for (int i = 1; i < num; i++)
        {
            if (num % i == 0)
            {
                if (k == 1)
                {
                    Console.Write(i);
                    k = 2;
                }
                else
                {
                    Console.Write("," + i);
                }
            }
        }
        Console.WriteLine();
    }            
}

判断润年

int Year = Convert.ToInt32(Console.ReadLine());
if (Year % 4 == 0)
{
    if (Year % 100 != 0)
        Console.WriteLine("Y");
    else if (Year % 400 == 0)
        Console.WriteLine("Y");
    else
        Console.WriteLine("N");
}
else
{
    Console.WriteLine("N");
}

完美立方

void JudgeWanMeiLiFang(int num)
{
    int LF = num * num * num;
    for (int i = 1; i < num; i++)
    {
        for (int j = i; j < num; j++)
        {
            for (int k = j; k < num; k++)
            {
                if (LF == i * i * i + j * j * j + k * k * k)
                {
                    Console.WriteLine("Cube = {0}, Triple = ({1},{2},{3})", num, i, j, k);
                }
            }
        }
    }
}

奇偶数排序

string read = Console.ReadLine();
string[] snum = read.Split(' ');
List<int> evnnums = new List<int>();
List<int> oddnums = new List<int>();
for (int i=0;iint temp = Convert.ToInt32(snum[i]);
    if(temp%2==0)
    {
        oddnums.Add(temp);
    }
    else
    {
        evnnums.Add(temp);
    }
}
oddnums.Sort();
evnnums.Sort((a, b) => { return a < b?1:-1; });
for(int i =0;i" ");
}
for (int i = 0; i < oddnums.Count; i++)
{
    Console.Write(oddnums[i]+ " ");
}

计算反序数

0 的反序数为0
-0 的反序数为0
100的反序数为1
-23的反序数为-32

int num = Convert.ToInt32(Console.ReadLine());
if(num==0)
{
    Console.WriteLine("0");
    return;
}
else if(num<0)
{
    Console.Write("-");
    num = Math.Abs(num);
}
while(num!=0)
{
    int temp = num % 10;
    if(temp!=0)
    {
        Console.Write(temp);
    }                
    num /= 10;
}

五猴分桃

有五只猴子采了一堆桃,商量第二天分桃子。一只猴子半夜醒来,把桃分五份,多一个,自己吃掉一个再拿走自己的一份;第二只猴子醒来时,把剩余的桃子又分成五份,也多了一个,自己吃掉多的那一个,然后再拿走自己的一份;第三、四、五只醒来时,也做了同样的事(提示:分五份多一个,吃掉多出的那一个,后再拿走自己的一份)。那堆桃子至少有多少个?

//暴力枚举法
for(int i=1;i<10000;i++)
{
    float res = i;
    for(int j=0;j<5;j++)
    {
        res = (res - 1) * 4 / 5;
    }
    int temp = (int)res;
    if(temp == res)
    {
        Console.WriteLine("起始最少桃子数:{0},最后剩余的桃子数:{1}", i, res);
        break;
    }
}

斐波那契数列

1 , 1,2,3,5,8,13,……….

int fibonacci1(int n)
{
if(n==1||n==2){
    return 1;
}

int a=1;
int b=1;
int result=0;
for(int i=2;ireturn result;

}

你可能感兴趣的:(C#,知识综合)