1. 程式人生 > >常見的演算法筆試題

常見的演算法筆試題

試題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", n);
    for (int i = 0; i < 9;i++)
    {
        printf("%d", result[i]);
    }
    printf(
"\n"); 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\n
", number, score); } return average; } else { printf("Average=%d\n", 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\n", 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\n", 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] = '\0';
            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 ? ' ' : '\n');
    }
    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("\nNo.%d:\n", ++iCount);
                for (int i = 0; i < ROWS;i++)
                {
                    for (int j = 0; j < COLS; j++)
                    {
                        printf("%d%c", Grid[i][j], (j + 1) % COLS ? ' ' : '\n');
                    }
                }
                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\n");
    }
    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("\tSum=%d\n\n", 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]!='\0');
    while (B[++LenB] != '\0');
    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] = '\0';
    Mutiple(A, B, C);
    for (int i = 0; C[i] != '\0'; i++)
    {
        printf("%c", C[i]);
    }
    printf("\n");
    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] = '\0';
        return iMax;        //返回連續數字的最大長度
    }
}
int main(int argc, char* argv[])
{
    char strSource[] = "ads3s1456789DE34561d345AA";
    char strResult[sizeof(strSource)];
    printf("Len=%d,strResult=%s\nstrSource=%s\n", 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\n",MinCost);
    for (int i = 0; i < N;i++)
    {
        printf("\t任務%d由工人%d來做:%d\n", 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!='\0')
        {
            pSubString++;
            pParentString++;
        }
        if (*pSubString=='\0')
        {
            return pTmp;
        }
    }
    return NULL;
}

int main(int argc, char* argv[])
{
    char *ParentString = "happy birthday to you!";
    char *SubString = "birthday";
    printf("%s\n", 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("\n");
    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\n", str);
    printf("str2=%s,count=%d\n", 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("\n");
}
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\tval=%d\n", 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\n", 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("\n");
}
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\n", 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] = '\0';
}

int main(int argc, char* argv[])
{
    char str[] = "abc123de4fg56";
    printf("%s\n", str);
    delNum(str);
    printf("%s\n", 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\nstr2=%s\nMaxSubString=%s\n", 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\n", str);
    change(str);
    printf("strResult=%s\n", 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] = '\0';
}
int main(int argc, char* argv[])
{
    char str[] = "abcdefgh"; //注意,此處不能寫成char *str="abcdefgh"
    printf("原字串:%s\n", str);
    delChar(str, 'c');
    printf("刪除後的字串:%s\n", 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\n", 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("\n");
    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\n", 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\n", 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("\n%d是完全平方數\n", 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("\n\n");
    }
    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("\n");
    }
    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\n");
    while ((c=getchar())!='\n')
    {
        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\n", 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\r\n",color);    
        cprintf("Press any key to continue\r\n");
        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("\n"); /*5個數一行*/
            n++;
            printf("%5d", x);
        }
    }
    printf("\n");
    printf("1-100之間共有%d個素數。\n", count);