常見的演算法筆試題
試題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);