试题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); 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("最后留下来的人的编号:%d\n", 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("%s\t%s\t%.1f\t%.1f\t%.1f\t%.lf\n", 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("%s\n", 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\n", 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("加密:%d\n", result); printf("解密:%d\n", 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\n", GetCnt(test[i])); } system("pause"); return 0; }
实现结果: