试题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:%dn", number, score);
        }
        return average;
    }
    else
    {
        printf("Average=%dn", 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:%sn", 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%cn", 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 ? ' ' : '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("Failuren");
    }
    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=%dnn", 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("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] = '';
        return iMax;        //返回连续数字的最大长度
    }
}
int main(int argc, char* argv[])
{
    char strSource[] = "ads3s1456789DE34561d345AA";
    char strResult[sizeof(strSource)];
    printf("Len=%d,strResult=%snstrSource=%sn", 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("最佳方案总费用=%dn",MinCost);
    for (int i = 0; i < N;i++)
    {
        printf("t任务%d由工人%d来做:%dn", 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("%sn", 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=%sn", str);
    printf("str2=%s,count=%dn", 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=%stval=%dn", 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+%dn", 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 %dn", 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("%sn", str);
    delNum(str);
    printf("%sn", 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=%snstr2=%snMaxSubString=%sn", 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=%sn", str);
    change(str);
    printf("strResult=%sn", 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("原字符串:%sn", str);
    delChar(str, 'c');
    printf("删除后的字符串:%sn", 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("%dn", 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%dn", 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=%dn", 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("nn");
    }
    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 charactersn");
    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=%dn", 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 %drn",color);    
        cprintf("Press any key to continuern");
        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);
    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:n");
    for (i = 0; i < 10;i++)
    {
        printf("%5d", a[i]);
    }
    printf("n");
    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", 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("n");
    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("最后留下来的人的编号:%dn", 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个学生的信息:n", s - student + 1);
        printf("姓名:");
        scanf("%s", s->name);
        printf("学号:");
        scanf("%s", &s->idnum);
        printf("语文 数学 英语:n");
        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("n学生信息n姓名t学号t语文t数学t英语t总分n");
    for (s = student; s < student + n; s++)
    {
        s->total = s->score[0] + s->score[1] + s->score[2];
        printf("%st%st%.1ft%.1ft%.1ft%.lfn", 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分的学生的学号为:n");
    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("%sn", 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:%fn", 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("原始数据:n");
    scanf("%d", &in);
    int result = code(in);
    printf("加密:%dn", result);
    printf("解密:%dn", 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("%dn", GetCnt(test[i]));
    }
    system("pause");
    return 0;
}

 实现结果:

 

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!

相关课程