zoukankan      html  css  js  c++  java
  • 常见的算法笔试题

    试题1:将一整数逆序后放入一组数组,要求递归实现。

    代码实现:

    #include "stdio.h"
    void convert(int *result, int n);
    int main(int argc,char* argv[])
    {
        int n = 123456789,result[20] = {0};
        convert(result, n);
        printf("%d:
    ", n);
        for (int i = 0; i < 9;i++)
        {
            printf("%d", result[i]);
        }
        printf("
    ");
        system("pause");
        return 0;
    }
    
    void convert(int *result, int n)
    {
        if (n>=10)
        {
            convert(result + 1, n / 10);
        }
        *result = n % 10;
    }

    实现结果:

    试题2:求高于平均分的学生学号及成绩,学号和成绩人工输入。

    代码实现:

    #include "stdio.h"
    double find(int total, int n);
    int main()
    {
        find(0, 0);
        system("pause");
        return 0;
    }
    double find(int total, int n)
    {
        int number, score, average;  //学号、分数、平均分
        scanf("%d", &number);
        if (number!=0)
        {
            scanf("%d", &score);
            average = find(total + score, +n + 1);
            if (score>=average)
            {
                printf("%d:%d
    ", number, score);
            }
            return average;
        }
        else
        {
            printf("Average=%d
    ", total / n);
            return total / n;
        }
    }

    试题3:递归实现回文判断,例如a-b-c-d-e-d-c-b-a就是回文,这是判断一个面试者对递归理解的简单程序。

    代码实现:

    #include "stdio.h"
    int find(char* str, int n);
    int main(int argc,char* argv[])
    {
        char *str = "abcdedcba";
        printf("%s:%s
    ", str, find(str, strlen(str))? "Yes" : "No");
        system("pause");
        return 0;
    }
    int find(char* str, int n)
    {
        if (n<=1)
        {
            return 1;
        }
        else if (str[0]==str[n-1])
        {
            return find(str + 1, n - 2);
        }
        else
        {
            return 0;
        }
    }

     试题4:从M个不同字符串任取N个字符的所有组合,考察了组合问题。

    代码实现:

    #include "stdio.h"
    void find(char *source, char *result, int n);
    int main(int argc, char *argv)
    {
        int const n = 3;
        char *source = "ABCDE", result[4] = { 0 };
        if (n>0&&strlen(source)>0&&n<=strlen(source))
        {
            find(source, result, 3);
        }
        system("pause");
        return 0;
    }
    void find(char *source, char *result, int n)
    {
        if (n==1)
        {
            while (*source)
            {
                printf("%s%c
    ", result, *source++);
            }
        }
        else
        {
            int i, j;
            for (i = 0; source[i] != 0; i++);
            for (j = 0; result[j] != 0; j++);
            for (; i >= n;i--)
            {
                result[j] = *source++;
                result[j + 1] = '';
                find(source, result, n - 1);
            }
        }
    }

     试题5:分解成质因数,例如435234=251x17x17x3x2。

    代码实现:

    #include "stdio.h"
    void prim(int m, int n);
    int main(int argc, char *argv[])
    {
        int n = 435234;
        printf("%d=", n);
        prim(n, 2);
        system("pause");
        return 0;
    }
    void prim(int m, int n)
    {
        if (m>n)
        {
            while (m%n!=0) n++;
            m /= n;
            prim(m,n);
            prim("%d*", n);
        }
    }

    试题6:寻求迷宫的一条出路,用o表示通路;用X表示障碍。

    代码实现:

    #include "stdio.h"
    #define MAX_SIZE 8
    int H[4] = { 0, 1, 0, -1 };
    int V[4] = { -1, 0, 1, 0 };
    char Maze[MAX_SIZE][MAX_SIZE] = { { 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' },
                                      { 'o', 'o', 'o', 'o', 'o', 'X', 'X', 'X'},
                                      { 'X', 'o', 'X', 'X', 'o', 'X', 'X', 'X' },
                                      { 'X', 'o', 'X', 'X', 'o', 'X', 'X', 'o' },
                                      { 'X', 'o', 'X', 'X', 'X', 'X', 'X', 'X' },
                                      { 'X', 'o', 'X', 'X', 'o', 'o', 'o', 'X' },
                                      { 'X', 'o', 'o', 'o', 'o', 'X', 'o', 'o' },
                                      { 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' }
                                    };
    void FindPath(int X, int Y)
    {
        if (X==MAX_SIZE||Y==MAX_SIZE)
        {
            for (int i = 0; i < MAX_SIZE;i++)
            for (int j = 0; j < MAX_SIZE; j++)
                printf("%c%c", Maze[i][j], j < MAX_SIZE - 1 ? ' ' : '
    ');
        }
        else
        {
            for (int k = 0; k < 4;k++)
            {
                if (X >= 0 && Y >= 0 && Y < MAX_SIZE&&X < MAX_SIZE&&'o' == Maze[X][Y])
                {
                    Maze[X][Y] = ' ';
                    FindPath(X + V[k], Y + H[k]);
                    Maze[X][Y] = 'o';
                }
            }
        }    
    }
    int main(int argc, char *argv[])
    {
        FindPath(1, 0);
        system("pause");
        return 0;
    } 

    实现结果:

    试题7:求网格中的黑点分布。现有6x7的网格,在某些格子中有黑点,已知各行与各列中有黑点的点数之和,请在这张网格中画出黑点的位置。

     代码实现:

    #define ROWS 6
    #define COLS 7
    int iPointsR[ROWS] = { 2, 0, 4, 3, 4, 0 }; //各行黑点数和的情况
    int iPointsC[COLS] = { 4, 1, 2, 2, 1, 2, 1 };//各列黑点数和的情况
    int iCount, iFound;
    int iSumR[ROWS], iSumC[COLS], Grid[ROWS][COLS];
    
    int Set(int iRowNo)
    {
        if (iRowNo==ROWS)
        {
            for (int iColNo = 0; iColNo < COLS&&iSumC[iColNo]==iPointsC[iColNo];iColNo++)
            {
                if (iColNo==COLS-1)
                {
                    printf("
    No.%d:
    ", ++iCount);
                    for (int i = 0; i < ROWS;i++)
                    {
                        for (int j = 0; j < COLS; j++)
                        {
                            printf("%d%c", Grid[i][j], (j + 1) % COLS ? ' ' : '
    ');
                        }
                    }
                    iFound = 1;//有解
                }
                else
                {
                    for (int iColNo = 0; iColNo < COLS;iColNo++)
                    {
                        if (iPointsR[iRowNo] == 0)
                        {
                            Set(iRowNo + 1);
                        }
                        else if (Grid[iRowNo][iColNo] == 0)
                        {
                            Grid[iRowNo][iColNo] = 1;
                            iSumR[iRowNo]++;
                            iSumC[iColNo]++;
                            if (iSumR[iRowNo]<iPointsR[iRowNo]&&iSumC[iColNo]<=iPointsC[iColNo])
                            {
                                Set(iRowNo);
                            }
                            else if (iSumR[iRowNo]==iPointsR[iRowNo]&&iRowNo<ROWS)
                            {
                                Set(iRowNo + 1);
                                Grid[iRowNo][iColNo] = 0;
                                iSumR[iRowNo]--;
                            }
                            iSumC[iColNo]--;
                        }
                    }
                }
            }
        }
        return iFound;   //用于判断是否有解
    }
    
    int main(int argc, char* arv[])
    {
        if (!Set(0))
        {
            printf("Failure
    ");
        }
        system("pause");
        return 0;
    }

     试题8:现有4中面值的邮票很多枚,这4种邮票的面值分别是1、4、12、21,现有从多张中最多任取5张进行组合,求取这些邮票的最大连续组合值,即面值和最大的组合。

     代码实现:

    #define N 5
    #define M 5
    int k, Found, Flag[N];
    int Stamp[M] = { 0, 1, 4, 12, 21 };
    
    //在剩余张数n中组合出面值和Value
    int Combine(int n, int Value)
    {
        if (n >= 0&&Value == 0)
        {
            Found = 1;
            int Sum = 0;
            for (int i = 0; i < N&&Flag[i] != 0;i++)
            {
                Sum += Stamp[Flag[i]];
                printf("%d", Stamp[Flag[i]]);
            }
            printf("	Sum=%d
    
    ", Sum);
        }
        else for (int i = 1; i<M&&!Found&&n>0;i++)
        {
            if (Value-Stamp[i]>=0)
            {
                Flag[k++] = i;
                Combine(n - 1, Value - Stamp[i]);
                Flag[--k] = 0;
            }
        }
        return Found;
    }
    
    int main(int argc, char* argv[])
    {
        for (int i = 1; Combine(N, i); i++, Found = 0);
        system("pause");
        return 0;
    }

     试题9:大数相乘的问题。

    代码实现:

    #include "stdio.h"
    
    void Mutiple(char A[], char B[], char C[])
    {
        int TMP, In = 0, LenA = -1, LenB = -1;
        while (A[++LenA]!='');
        while (B[++LenB] != '');
        int Index, Start = LenA + LenB - 1;
        for (int i = LenB - 1; i >= 0;i--)
        {
            Index = Start--;
            if (B[i]!='0')
            {
                for (int In = 0, j = LenA - 1; j >= 0;j--)
                {
                    TMP = (C[Index] - '0') + (A[j] - '0')*(B[i] - '0') + In;
                    C[Index--] = TMP % 10 + '0';
                    In = TMP / 10;
                }
                C[Index] = In + '0';
            }
        }
    }
    int main(int argc, char*argv[])
    {
        char A[] = "218392444444444488800888888889";
        char B[] = "388888888888999999999999999988";
        char C[sizeof(A)+sizeof(B)-1];
        for (int k = 0; k < sizeof(C);k++)
        {
            C[k] = '0';
        }
        C[sizeof(C)-1] = '';
        Mutiple(A, B, C);
        for (int i = 0; C[i] != ''; i++)
        {
            printf("%c", C[i]);
        }
        printf("
    ");
        system("pause");
        return 0;
    }

    试题10:求最大连续递增数字串,例如“ads31456789DF34561d345AA”中的“456789”。

    代码实现:

    #include "stdio.h"
    int GetSubString(char *strSource, char *strResult)
    {
        int iTmp = 0, iHead = 0, iMax = 0;
        for (int Index = 0, iLen = 0; strSource[Index];Index++)
        {
            if (strSource[Index] >= '0'&&strSource[Index]<'9'&&strSource[Index - 1]>'0'&&strSource[Index] == strSource[Index-1]+1)
            {
                iLen++;    //连续数字的长度增1
            }
            else           //出现字符或不连续数字
            {
                if (iLen>iMax)
                {
                    iMax = iLen; iHead = iTmp;
                }
                //该字符数数字,但是数字不连续
                if (strSource[Index] >= '0'&&strSource[Index] <= '9')
                {
                    iTmp = Index;
                    Index = 1;
                }
            }
        }
        for (iTmp = 0; iTmp < iMax;iTmp++)   //将原字符串中最长的连续数字串赋给结果串
        {
            strResult[iTmp] = strSource[iHead++];
            strResult[iTmp] = strSource[iHead++];
            strResult[iTmp] = '';
            return iMax;        //返回连续数字的最大长度
        }
    }
    int main(int argc, char* argv[])
    {
        char strSource[] = "ads3s1456789DE34561d345AA";
        char strResult[sizeof(strSource)];
        printf("Len=%d,strResult=%s
    strSource=%s
    ", GetSubString(strSource, strResult), strResult, strSource);
        system("pause");
        return 0;
    }

    试题11:4个工人有4个任务,每个人做不同的任务需要的时间不同,求任务分配的最优方案。

    代码实现:

     #define N 4
    int Cost[N][N] = { {2,12,5,32},
                       {8,15,7,11},
                       {24,18,9,6},
                       {21,1,8,28}};
    int MinCost = 1000;
    int Task[N], TempTask[N], Worker[N];
    void Assign(int k, int cost)
    {
        if (k==N)
        {
            MinCost = cost;
            for (int i = 0; i < N;i++)
            {
                TempTask[i] = Task[i];
            }
        }
        else
        {
            for (int i = 0; i < N;i++)
            {
                if (Worker[i]==0&&cost+Cost[k][i]<MinCost)  //为提高效率而进行剪枝
                {
                    Worker[i] = 1; Task[k] = i;
                    Assign(k + 1, cost + Cost[k][i]);
                    Worker[i] = 0; Task[k] = 0;
                }
            }
        }
    }
    
    int main(int argc, char* arv[])
    {
        Assign(0, 0);
        printf("最佳方案总费用=%d
    ",MinCost);
        for (int i = 0; i < N;i++)
        {
            printf("	任务%d由工人%d来做:%d
    ", i, TempTask[i], Cost[i][TempTask[i]]);
        }
        system("pause");
        return 0;
    }

    实现结果:

    试题12:实现和函数strstr()一样的功能,即在父子串中寻找子串首次出现的位置。

    /* 实现和函数strstr()函数一样的功能,即在父串中寻找子串首次出现的位置*/
    #include "stdio.h"
    char* strstring(char *ParentString, char *SubString)
    {
        char *pSubString, *pParentString;
        for (char *pTmp = ParentString; *pTmp;pTmp++)
        {
            pSubString = SubString;
            pParentString = pTmp;
            while (*pSubString==*pParentString&&*pSubString!='')
            {
                pSubString++;
                pParentString++;
            }
            if (*pSubString=='')
            {
                return pTmp;
            }
        }
        return NULL;
    }
    
    int main(int argc, char* argv[])
    {
        char *ParentString = "happy birthday to you!";
        char *SubString = "birthday";
        printf("%s
    ", strstring(ParentString, SubString));
        system("pause");
        return 0;
    }

     试题13:黑夜小明一家过桥问题,过桥时间最短的方案。

    #include "stdio.h"
    #define N 5
    #define SIZE 64
    
    //将人员编号:小明-0,弟弟-1,爸爸-2,妈妈-3,爷爷-4
    //每个人的当前位置:0-在桥左边,1-在桥右边
    int Position[N];
    //过桥临时方案的数组下标,临时方案;最小时间方案;
    int Index, TmpScheme[SIZE], Scheme[SIZE];
    //最小过桥时间总和,初始值100,每个人过桥所需的时间
    int MinTime = 100, Time[N] = { 1, 3, 6, 8,12 };
    //寻求最佳过桥方案。Remnant:未过桥人数;CurTime:当前已用时间;
    //Direction:过桥方向,1-向右,0-向左
    void Find(int Remnant, int CurTime, int Direction)
    {
        if (Remnant==0)    //所有人已经过桥,更新最少时间及方案
        {
            MinTime = CurTime;
            for (int i = 0; i < SIZE&&TmpScheme[i] >= 0; i++)
            {
                Scheme[i] = TmpScheme[i];
            }
        }
        else if (Direction==1)     //过桥方向向右,从桥左侧选出两人过桥
        {
            for (int i = 0; i < N;i++)
            {
                if (Position[i]==0&&CurTime+Time[i]<MinTime)
                {
                    TmpScheme[Index++] = i;
                    Position[i] = 1;
                    for (int j = 0; j < N;j++)
                    {
                        int TmpMax = (Time[i]>Time[j] ? Time[i] : Time[j]);
                        if (Position[j]==0&&CurTime+TmpMax<MinTime)
                        {
                            TmpScheme[Index++] = j;
                            Position[j] == 1;
                            Find(Remnant - 2, CurTime + TmpMax, !Direction);
                            Position[j] = 0;
                            TmpScheme[--Index] = -1;
                        }
                    }
                }
            }
        }
        else           //过桥方向向左,从桥右侧候选出一个人回来送灯
        {
            for (int j = 0; j < N;j++)
            {
                if (Position[j]==1&&CurTime+Time[j]<MinTime)
                {
                    TmpScheme[Index++] = j;
                    Position[j] = 0;
                    Find(Remnant + 1, CurTime + Time[j], !Direction);
                    Position[j] = 1;
                    TmpScheme[--Index] = -1;
                }
            }
        } 
    }
    int main(int argc, char* argv[])
    {                                    
        for (int i = 0; i < SIZE;i++)    //初始化方案内容为负值,避免和人员标号冲突
        {
            Scheme[i] = TmpScheme[i] = -1;
        }
        Find(N, 0, 1);             //查找最佳方案
        printf("MinTime=%d:", MinTime); //输出最佳方案
        for (int i = 0; i < SIZE&&Scheme[i]>0;i++)
        {
            printf("&d-%d %d", Scheme[i], Scheme[i + 1], Scheme[i + 2]);
        }
        printf("
    ");
        system("pause");
        return 0;
    }

     试题14:编码完成下面的处理函数:函数将字符串中的字符“*”移到串的前部分,前面的非“*”字符后移,但不改变非“*”字符的先后顺序,函数将返回串中字符“*”的数量。假如原始串为ab**cd**e*12,则处理后问题*****abcde12,这时函数的返回值为5,。要求使用尽量少的时间和辅助空间实现。

    代码实现:

    #include "stdio.h"
    /*int change(char *str)                                          //这个算法并不高效,从后面向前搜索效率要高些
    {
        int count = 0;                                             //记录串中字符'*'的个数
        for (int i = 0, j = 0; str[i];i++)                         //从串首开始遍历
        {
            if (str[i]=='*')                                       //遇到'*'
            {
                for (j = i - 1; str[j] != '*'&&j >= 0;j--)         //采用类似插入排序的思想,将*前面的非*字符逐个后移,直到遇到*字符
                {
                    str[j + 1] = str[j];
                }
                str[j + 1] = '*';
                count++;
            }
        }
        return count;
    }*/
    int main(int argc, char* argv[])
    {
        char str[] = "ab**cd**e*12";
        printf("str1=%s
    ", str);
        printf("str2=%s,count=%d
    ", str, change(str));
        system("pause");
        return 0;
    }
    //下面是一个高效的算法
    int change(char *str)
    {
        int i, j = strlen(str) - 1;
        for (i = j; j >= 0;j--)
        {
            if (str[i]!='*')
            {
                i--;
            }
            else if (str[j]!='*')
            {
                str[i] = str[j];
                str[j] = '*';
                i--;
            }
        }
        return i + 1;
    }

     实现结果:

    试题15:实现一个单链表的逆转。

    代码实现:

    #include "stdio.h"
    typedef char eleType;    //定义链表中的数据结构
    typedef struct listnode  //定义单链表结构
    {
        eleType data;
        struct listnode *next;
    }node;
    node *create(int n)  //创建单链表,n为节点个数
    {
        node *p = (node *)malloc(sizeof(node));
        node *head = p; head->data = 'A';
        for (int i = 'B'; i < 'A' + n;i++)
        {
            p = (p->next = (node *)malloc(sizeof(node)));
            p->data = i;
            p->next = NULL;
        }
    }
    void print(node *head)    //按链表顺序输出链表中的元素
    {
        for (; head;head=head->next)
        {
            printf("%c", head->data);
        }
        printf("
    ");
    }
    node *reverse(node *head, node *pre)  //逆转单链表函数。这是笔试时需要写的最主要的函数
    {
        node *p = head->next;
        head->next = pre;
        if (p)
        {
            return reverse(p, head);
        }
        else
        {
            return head;
        }
    }
    
    int main(int argc, char* argv[])
    {
        node *head = create(6);
        print(head);
        head = reverse(head, NULL);
        print(head);
        system("pause");
        return 0;
    }

     试题16:编码实现字符串转整型的函数,实现C语言中库函数atoi()的功能。

     代码实现:

    #include "stdio.h"
    int str2int(const char *str)          //字符串转整型函数
    {
        int i = 0, sign = 1, value = 0;
        if (str==NULL)                    //空串直接返回NULL
        { 
            return NULL;           
        }
        if (str[0] == '-' || str[0] == '+')      
        {
            i = 1;
            sign = (str[0] == '-' ? -1 : 1);
        }
        for (; str[i] >= '0'&&str[i] <= '9';i++)    //如果是数字,则继续转换
        {
            value = value * 10 + (str[i] - '0');
        }
        return sign*value;
    }
    int main(int argc, char *argv[])
    {
        char *str = "-123.45CS67";
        int val = str2int(str);
        printf("str=%s	val=%d
    ", str, val);
        system("pause");
        return 0;
    }

    实现结果:

    试题17:哥德巴赫猜想,任何一个偶数都可以分解为两个素数之和。

    #include "stdio.h"
    #include "math.h"
    int main(int argc, char *argv)
    {
        int Even = 78, Prime1, Prime2, Tmp1,Tmp2;
        for (Prime1 = 3; Prime1 <= Even / 2;Prime1+=2)
        {
            for (Tmp1 = 2, Tmp2 = sqrt((float)Prime1); Tmp1 <= Tmp2&&Prime1%Tmp1 != 0; Tmp1++);
            if (Tmp1<Tmp2)
            { 
                continue;
            }
            Prime2 = Even - Prime1;
            for (Tmp1 = 2, Tmp2 = sqrt((float)Prime1); Tmp1 <= Tmp2&&Prime2%Tmp1 != 0; Tmp1++);
            if (Tmp1 < Tmp2)
            {
                continue;
            }
            printf("%d=%d+%d
    ", Even, Prime1, Prime2);
        }
        system("pause");
        return 0;
    }

     实现结果:

    试题18:实现快速排序。

    代码实现:

    #define N 10
    int part(int list[], int low, int high)  //一趟排序返回分割点的位置
    {
        int tmp = list[low];
        while (low < high)
        {
            while (low < high&&list[high] >= tmp) --high;
            list[low] = list[high];
            while (low < high&&list[low] <= tmp) ++low;
            list[high] = list[low];
        }
        list[low] = tmp;
        return low;
    }
    
    void QSort(int list[], int low, int high)          //应用递归进行快速排序
    {
        if (low<high)
        {
            int mid = part(list, low, high);
            QSort(list, low, mid - 1);
            QSort(list, mid + 1, high);
        }
    }
    void show(int list[], int n)                      //输出列表中的元素
    {
        for (int i = 0; i < n;i++)
        {
            printf("%d ", list[i]);
        }
        printf("
    ");
    }
    int main(int argc,char* argv[])                      //输出列表中的元素
    {
        int list[N] = { 23, 65, 26, 1, 6, 89, 3, 12, 33, 8 }; 
        show(list, N);           //输出排序前的序列
        QSort(list, 0, N - 1);   //快速排序
        show(list, N);           //输出排序后的序列
        system("pause");
        return 0;
    }

     实现结果:

    参考资料:https://blog.csdn.net/tizzzzzz/article/details/79610375      https://www.cnblogs.com/lifexy/p/7597276.html

    试题19:写一个函数判断某个整数是否为回文数。

    代码实现:

    #include "stdio.h"
    int IsEchoNum(int num)
    {
        int tmp = 0;
        for (int n = num; n;n/=10)
        {
            tmp = tmp * 10 + n % 10;
        }
        return tmp == num;
    }
    
    int main(int argc, char* argv[])
    {
        int num = 12321;
        printf("%d %d
    ", num, IsEchoNum(num));
        system("pause");
        return 0;
    }

     实现结果:

    试题20:删除字符串中的数字并压缩字符串,例如字符串“abc123de4fg56”处理后变为“abcdefg”。注意空间和效率。

    代码实现:

    #include "stdio.h"
    void delNum(char *str)
    {
        int i, j = 0;
        //找到串中第一个数字的位置
        for (i = j = 0; str[i] && (str[i]<'0' || str[i]>'9');j=++i);
        //从串中第一个数字的位置开始,逐个放入后面的非数字字符
        for (; str[i];i++)
        {
            if (str[i]<'0'||str[i]>'9')
            {
                str[j++] = str[i];
            }
        }
        str[j] = '';
    }
    
    int main(int argc, char* argv[])
    {
        char str[] = "abc123de4fg56";
        printf("%s
    ", str);
        delNum(str);
        printf("%s
    ", str);
        system("pause");
        return 0;
    }

     实现结果:

    21.求两个字符串中的第一个最长子串。如“abractyeyt”、“dgdsaeactyey”的最大子串为“actyey”。

    代码实现:

    #include "stdio.h"
    char *MaxSubString(char *str1, char *str2)
    {
        int i, j, k, index, max = 0;
        for (i = 0; str1[i];i++)
        {
            for (j = 0; str2[j];j++)
            {
                for (k = 0; str1[i + k] == str2[j + k] && (str1[i + k] || str2[j + k]); k++);
                if (k>max)     //出现大于当前子串长度的子串,则替换子串的位置
                {
                    index = j; max = k;
                }
            }
        }
        char *strResult = (char *)calloc(sizeof(char), max + 1);
        for (i = 0; i < max;i++)
        {
            strResult[i] = str2[index++];
        }
        return strResult;
    }
    
    int main(int argc, char* argv[])
    {
        char str1[] = "abractyeyt", str2[] = "dgdsaeactyey";
        char *strResult = MaxSubString(str1, str2);
        printf("str1=%s
    str2=%s
    MaxSubString=%s
    ", str1, str2, strResult);
        system("pause");
        return 0;
    }

     实现结果:

    22.不用开辟用于交换数据的临时空间,如何完成字符串的逆序?

    代码实现:

    #include "stdio.h"
    void change(char *str)
    {
        for (int i = 0, j = strlen(str) - 1; i < j;i++,j--)
        {
            str[i] ^= str[j] ^= str[i] ^= str[j];
        }
    }
    int main(int argc, char* argv[])
    {
        char str[] = "abcdefg";
        printf("strSource=%s
    ", str);
        change(str);
        printf("strResult=%s
    ", str);
        system("pause");
        return 0;
    }

     实现结果:

    23.删除串中指定的字符,提示千万不要开辟新空间,否则面试官可能认为你不合适做嵌入式开发。

    代码实现:

    #include "stdio.h"
    void delChar(char *str, char c)
    {
        int i, j = 0;
        for (i = 0; str[i];i++)
        {
            if (str[i]!=c)
            {
                str[j++] = str[i];
            }
        }
        str[j] = '';
    }
    int main(int argc, char* argv[])
    {
        char str[] = "abcdefgh"; //注意,此处不能写成char *str="abcdefgh"
        printf("原字符串:%s
    ", str);
        delChar(str, 'c');
        printf("删除后的字符串:%s
    ", str);
        system("pause");
        return 0;
    }

     实现结果:

    24.判断单链表是否存在环。

    代码实现:

    #include "stdio.h"
    typedef char eleType;  //定义链表中的数据类型
    typedef struct listnode //定义单链表结构
    {
        eleType data;
        struct listnode *next; 
    }node;
    
    node *create(int n)  //创建单链表,n为节点个数
    {
        node *p = (node *)malloc(sizeof(node));
        node *head = p; head->data = 'A';
        for (int i = 'B'; i < 'A' + n; i++)
        {
            p = (p->next = (node *)malloc(sizeof(node)));
            p->data = i;
            p->next = NULL;
        }
        return head;
    }
    
    void addCircle(node *head, int n)  //增加环,将链表尾指向链中第n个节点
    {
        node *q=NULL, *p = head;
        for (int i = 1; p->next;i++)
        {
            if (i==n)
            {
                p = q;
            }
            p->next = q;
        }
        p->next = q;
    }
    int isCircle(node *head)     //笔试时需要写的最主要的函数,其他函数可以不写
    {
        node *p = head, *q = head;
        while (p->next&&q->next)
        {
            p = p->next;
            if (NULL==(q=q->next))
            {
                return 0;
            }
            if (p==q)
            {
                return 1;
            }
        }
        return 0;
    }
    
    int main(int argc, char* argv[])
    {
        node *head = create(12);
        addCircle(head, 8);     //不能注释掉此行,否则表损坏
        printf("%d
    ", isCircle(head)); 
        system("pause");
        return 0;
    }

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

    代码实现:

    #include "stdio.h"
    int main(int argc, char* argv[])
    {
        int i, j, k;
        printf("
    ");
        for (i = 1; i < 5;i++) //以下为三重循环
        {
            for (j = 1; j < 5;j++)
            {
                for (k = 1; k < 5;k++)
                {
                    if (i != j&&j != k&&i!=k) //确保i,j,k三位互补相同
                    {
                        printf("%d%d%d
    ", i, j, k);
                    }
                }
            }
        }
        system("pause");
        return 0;
    }

     实现结果:

     试题26:企业发放的奖金根据利润提成问题。

    代码实现:

    #include "stdio.h"
    int main()
    {
        long int i;
        int bonus1, bonus2, bonus4, bonus6, bonus10, bonus;
        scanf("%ld", &i);
        bonus1 = 100000 * 0.1;
        bonus2 = bonus1 + 100000 * 0.075;
        bonus4 = bonus2 + 200000 * 0.05;
        bonus6 = bonus4 + 200000 * 0.03;
        bonus10 = bonus6 + 400000 * 0.015;
        if (i < 100000)
        {
            bonus = i*0.1;
        }
        else if (i < 200000)
        {
            bonus = bonus1 + (i - 100000)*0.075;
        }
        else if (i<=400000)
        {
            bonus = bonus2 + (i - 200000)*0.05;
        }
        else if (i<=600000)
        {
            bonus = bonus4 + (i - 400000)*0.03;
        }
        else if (i<=1000000)
        {
            bonus = bonus6 + (i - 600000)*0.015;
        }
        else
        {
            bonus = bonus10 + (i - 1000000)*0.01;
        }
        printf("bonus=%d
    ", bonus);
        system("pause");
        return 0;
    } 

     实现结果:

    试题27:有一个整数,它加上一个完全平方数,再加上268又是一个完全平方数,请问该数是多少?

    代码实现:

    #include "stdio.h"
    int main()
    {
        long int i, x, y, z;
        for (i = 1; i < 100000;i++)
        {
            x = sqrt(i + 100);
            y = sqrt(i = 268);
            if (x*x==i+100&&y*y==i+268)
            {
                printf("
    %d是完全平方数
    ", i);
            }
        }
        system("pause");
        return 0;
    }

    试题28:输出9X9口诀。

    代码实现:

    #include "stdio.h"
    int main()
    {
        int i, j, result;
        for (i = 1; i < 10;i++)
        {
            for (j = 1; j <= i;j++)
            {
                result = i*j;
                printf("%d*%d=%-3d", i, j, result);
            }
            printf("
    
    ");
        }
        system("pause");
        return 0;
    }

     实现结果:

    试题29:输出国际象棋棋盘。

    代码实现:

    #include "stdio.h"
    int main()
    {
        int i, j;
        for (i = 0; i < 8;i++)
        {
            for (j = 0; j < 8;j++)
            if ((i+j)%2==0)
                printf("%c%c", 219, 219);
            else
                printf(" ");
                printf("
    ");
        }
        system("pause");
        return 0;
    }

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

    代码实现:

    #include "stdio.h"
    int main()
    {
        char c;
        int letters = 0, space = 0, digit = 0, others = 0;
        printf("Please input some characters
    ");
        while ((c=getchar())!='
    ')
        {
            if (c>='a'&&c<='z'||c>='A'&&c<='Z')
            {
                letters++;
            }
            else if (c==' ')
            {
                space++;
            }
            else if (c >= '0'&&c <= '9')
            {
                digit++;
            }
            else
            {
                others++;
            }
        }
        printf("all in all:char=%d space=%d digit=%d others=%d
    ", letters, space, digit, others);
        system("pause");
        return 0;
    }

     实现结果;

     试题31:Press any key to change color,do you want to try it.Please hurry up!

    代码实现:

    #include "conio.h"
    #include "stdio.h"
    void main(void){
        int color; 
        for(color = 0; color < 8; color++)  
        {
            textbackground(color);/*设置文本的背景颜色*/    
            cprintf("This is color %d
    ",color);    
            cprintf("Press any key to continue
    ");
            getch();/*输入字符看不见*/
        }
    }

    试题32:求100之内的素数。

    代码实现:

    #include <stdio.h>
    #include <math.h>
    int isPrimerNum(int n);//声明一个判断正整数是否为素数的函数
    int main()
    {
        int x, k, n = 0;           /*n用来控制每行输出5个数*/
        int count = 0;
        printf("输出100以内的所有素数:");
        for (x = 2; x <= 100; x++)
        {
            if (isPrimerNum(x) == 1)
            {
                count++;
                if (n % 5 == 0) printf("
    "); /*5个数一行*/
                n++;
                printf("%5d", x);
            }
        }
        printf("
    ");
        printf("1-100之间共有%d个素数。
    ", count);
        system("pause");
        return 0;
    }
    
    int isPrimerNum(int n)
    {
        int flag = 1;
        for (int k = 2; k <= sqrt(n); k++)
        if (n%k == 0)
        {
            flag = 0;
            break;
        }
        return flag;
    }

     实现效果:

     

    试题33:有一个已经排好序的数组,先输入一个数,要求按原来的规律将它插入到数组中。

    代码实现:

    #include "stdio.h"
    int main()
    {
        int a[11] = { 1, 4, 6, 9, 13, 16, 19, 28, 40, 100 };
        int temp1, temp2, number, end, i, j;
        printf("original array is:
    ");
        for (i = 0; i < 10;i++)
        {
            printf("%5d", a[i]);
        }
        printf("
    ");
        printf("insert a new number:");
        scanf("%d", &number);
        end = a[9];
        if (number>end)
        {
            a[10] = number;
        }
        else
        {
            for (i = 0; i < 10;i++)
            {
                if (a[i]>number)
                {
                    temp1 = a[i];
                    a[i] = number;
                    for (j = i + 1; j < 11; j++)
                    {
                        temp2 = a[j];
                        a[j] = temp1;
                        temp1 = temp2;
                    }
                    break;
                }        
            }
        }
        for (i = 0; i < 11;i++)
        {
            printf("%6d", a[i]);
        }
        system("pause");
        return 0;
    }
     

     实现效果:

    试题34:用line画一条线。

    试题35:假设有n个整数,使其前面的各数的顺序向后移m个位置,最后m个数恰好变成最前面的m个数。

    代码实现:

    #include<stdio.h>
    
    int main()
    {
        int change(int a[100], int n, int m);
        int n, m, i, a[100];
        printf("请输入数组长度n:");
        scanf("%d", &n);
        printf("请输入%d个数
    ", n);
        for (i = 0; i < n; i++)
        {
            scanf("%d", &a[i]);
    
        }
        printf("需要移动的数的个数m:");
        scanf("%d", &m);
        change(a, n, m);
        printf("新数列为:");
        for (i = 0; i < n; i++) // 去掉这里的分号
            printf("%d ", a[i]);
        printf("
    ");
        system("pause");
        return 0;
    }
    
    int change(int a[100], int n, int m)
    {
        int b[100], i;
        // 把最后m个存放在b
        for (i = 0; i < m; i++){
            b[i] = a[n - m + i];
        }
        // 把前面n-m个往后挪m个
        for (i = n - 1; i >= m; i--) {
            a[i] = a[i - m];
        }
        // 把前m个从b放回a
        for (i = 0; i < m; i++){
            a[i] = b[i];
        }
        return 0;
    }

     实现结果:

    试题36:有n个人围成一圈,顺序排号。从第一个人开始报数(从1~3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位?

    代码实现:

    #include "stdio.h"
    int main(){
        int a[100], i, quit_num, k, n;                //a存放n个人的编号 
        printf("input number:");
        scanf("%d", &n);                              //输入人数n 
        for (i = 0; i < n; i++)                       /*数组a存放原始编号*/
            a[i] = i + 1;
        quit_num = 0;                                 /*出圈人数*/
        i = 0;                                        //访问a数组的下标变量,即位置变量 
        k = 0;                                        //作为3次计数的变量 
        while (quit_num < n - 1){                     /*直到只剩下1人时*/
            if (a[i] != 0)                            ///不等于0的是该数的,等于0的已经退出
                k++;                                  ///数到1个不为0的就给3次计数变量k增1 
            if (k == 3){                              ///若k==3了,这个人就该退出了 
                a[i] = 0;                             ///用0标记这个人(下标为i的)退出 
                quit_num++;                           ///退出了1人,就给退出人数记录变量quit_num增1
                k = 0;                                ///退出1人时将3次记数变量k清0,为下次记数作准备 
            }
            i++;                                      ///每考察1个位子,无论是否有人都得将位子向后移1位 
            if (i == n)                               ///若已把位子移到最后1人的后面了则将其归0,重新从头记数 
                i = 0;
        }
        for (i = 0; i < n; i++)                       ///考察整个数组
        if (a[i] != 0)                                ///把数组中不为0的那个数打出来——他就是最后剩下的人的编号。 
            printf("最后留下来的人的编号:%d
    ", a[i]);
        system("pause");
        return 0;
    } 

     实现结果:

    试题37:编写C语言代码,模拟实现5个学生成绩记录的应用。

    代码实现:

    /*
    已知学生成绩单由学号、数学、语文、英语和总分组成。学号排列由001开始,时序增加(002、003、…),完成下列程序:
    (1)输入5个同学的三门课成绩,计算总分,生成成绩单。(10分)
    (2)在成绩单中查找总分大于260的学生学号。(15分)
    */
    #include <stdio.h>
    
    struct student {   //学生结构体
        char name[20];
        char idnum[3];  //学号
        float score[3]; //分别存三科成绩
        double total; // 总分
    };
    
    struct student * studentInfoInput(struct student *s, int n);//声明录入学生信息的函数
    struct student * studentInfoOutput(struct student *s, int n);//声明输出学生信息的函数
    struct student * totalScoreNum(struct student *s, int n);//声明输出总分大于260分的学生学号的函数
    
    int main()
    {
        struct student *s, student[5];
        // 录入学生信息
        studentInfoInput(student, 5);
        //输出学生的信息
        studentInfoOutput(student, 5);
        //输出总分大于260 分的学生学号
        totalScoreNum(student, 5);
        system("pause");
        return 0;
    }
    
    struct student * studentInfoInput(struct student *s, int n)
    {
        struct student * student = s;
        for (s = student; s < student + n; s++) {
            printf("输入第%d个学生的信息:
    ", s - student + 1);
            printf("姓名:");
            scanf("%s", s->name);
            printf("学号:");
            scanf("%s", &s->idnum);
            printf("语文 数学 英语:
    ");
            scanf("%f %f %f", &(s->score[0]), &(s->score[1]), &(s->score[2]));
        }
    }
    
    struct student * studentInfoOutput(struct student *s, int n)
    {
        struct student * student = s;
        printf("
    学生信息
    姓名	学号	语文	数学	英语	总分
    ");
        for (s = student; s < student + n; s++)
        {
            s->total = s->score[0] + s->score[1] + s->score[2];
            printf("%s	%s	%.1f	%.1f	%.1f	%.lf
    ", s->name, s->idnum, s->score[0], s->score[1], s->score[2], s->total);
        }
    }
    
    struct student * totalScoreNum(struct student *s, int n)
    {
        int i;
        struct student * totalScoreNum = s;
        printf("总分大于260分的学生的学号为:
    ");
        for (int i = 0; i < n; i++)
        {
            (s + i)->total = (s + i)->score[0] + (s + i)->score[1] + (s + i)->score[2];
            if ((s + i)->total>260)
            {
                totalScoreNum = s + i;
                printf("%s
    ", totalScoreNum->idnum);
            }
        }
    }

     实现结果:

    试题38:编写一个函数,当输入的n为偶数时,调用函数计算“1/2+1/4+...+1/n”;当输入的n为奇数时,调用函数可以计算:"1/1+1/3+...+1/n"。

    代码实现:

    #include <stdio.h>
    float sum1(int n);
    float sum2(int n);
    void main(){
        int n;
        printf("Input a number:");
        scanf("%d", &n);
        float(*sum)(int n); //定义一个指针函数
        if (n < 1) {
            printf("输入整数不在范围");
        }
        else if (n % 2 == 1){
            sum = sum1;
            printf("Computing Result:%f", sum(n));
        }
        else if (n % 2 == 0){
            sum = sum2;
            printf("Computing Result:%f
    ", sum(n));
        }
        system("pause");
        return 0;
    }
    float sum1(int n){
        float temp, sum=0.0;
        for (int i = 1; i <= n; i++){
            if (i % 2 == 1){
                temp = 1.0 / (float)i;
                sum += temp;
            }
        }
        return sum;
    }
    float sum2(int n){
        float temp, sum=0.0;
        for (int i = 1; i <= n; i++){
            if (i % 2 == 0){
                temp = 1.0 / (float)i;
                sum += temp;
            }
        }
        return sum;
    } 

     实现结果:

    试题39:电话传数据问题。

    代码实现:

    /*
        某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,
        加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,
        再将第一位和第二位交换,第四位和第三位交换
    */
    #include <stdio.h>
    int code(int in);             //加密
    int decode(int in);           //解密
    int main()
    {
        int in;
        printf("原始数据:
    ");
        scanf("%d", &in);
        int result = code(in);
        printf("加密:%d
    ", result);
        printf("解密:%d
    ", decode(result));
        system("pause");
        return 0;
    }
    int code(int in)
    {
        int result;
        int m[4];
        int n, i;
        for (i = 0; i < 4; i++)
        {
            m[i] = in % 10;
            m[i] += 5;
            m[i] %= 10;
            in /= 10;
        }
        n = m[0];
        m[0] = m[3];
        m[3] = n;
        n = m[1];
        m[1] = m[2];
        m[2] = n;
        result = m[0] + m[1] * 10 + m[2] * 100 + m[3] * 1000;
        return result;
    }
    int decode(int in)
    {
        int result;
        int m[4];
        int n, i;
        for (i = 0; i < 4; i++)
        {
            m[i] = in % 10;
            m[i] = (m[i] >= 5 ? m[i] - 5 : m[i] + 5);
            in /= 10;
        }
        n = m[0];
        m[0] = m[3];
        m[3] = n;
        n = m[1];
        m[1] = m[2];
        m[2] = n;
        result = m[0] + m[1] * 10 + m[2] * 100 + m[3] * 1000;
        return result;
    }

     实现结果:

    试题40:求a值。

    代码实现:

    #include "stdio.h"
    #define M 5
    int count = 0;
    int GetCnt(int n)
    {
        count = 0;
        do 
        {
            if (n&1)
            {
                count++;
            }
        } while (n>>=1);
        return count;
    }
    
    int main(int argc,char *argv[])
    {
        int test[M] = { 7, 3, 34, 2, 234 };
        for (int i = 0; i < M;++i)
        {
            printf("%d
    ", GetCnt(test[i]));
        }
        system("pause");
        return 0;
    }

     实现结果:

  • 相关阅读:
    (转)C# BackgroundWorker组件的原理分析
    (转)App.Config详解及读写操作
    (转)C# 控制蜂鸣器发声
    存储过程小例子
    DB通用类:MySQL通用类
    poj 1936 All in All
    Bone Collector 01背包问题
    sdut1359 求最大和子矩阵
    求最大值
    后缀式求值
  • 原文地址:https://www.cnblogs.com/hxf175336/p/9908008.html
Copyright © 2011-2022 走看看