這個問題仍是比較簡單的,n的階乘能夠寫成123*…*n,所以能夠利用一個循環函數,當<=n 算法
#include <stdio.h> int main() { int i = 1; int n = 0; int sum = 1; scanf("%d", &n); for (i = 1; i <= n; i++) { sum *= i; } printf("%d\n", sum); return 0; }
測試算出3的階乘,應該獲得1+2+6=9windows
必須將第二個for裏中ret初始化爲1,否則每一個n階乘都會乘上一個n-1的階乘數組
好比,將n == 3;沒有ret的初始化,輸出結果爲15,實際輸出應爲9ide
改進以下⬇⬇⬇⬇函數
#include <stdio.h> int main() { int i = 0; int n = 0; int ret = 1; int sum = 0; for (n = 1; n <= 3; n++) { ret = 1;//初始化ret for (i = 1; i <= n; i++) { ret = ret * i; } sum = sum + ret; } printf("%d", sum); return 0; }
int main() { int i = 0; int n = 0; int ret = 1; int sum = 0; for(n=1; n<=3; n++) { ret = ret * n; sum = sum + ret; } //ret = 1*1 = 1 //ret = 1*1*2 = 2 //ret = 1*1*2*3 = 6 printf("sum = %d\n", sum); return 0; }
題目:編寫int binsearch(int x, int v[], int n);測試
功能:在v[0]<=v[1]<=v[2]<= ….<=v[n-1]的數組中查找x。
解題思路:這個題目的意思就是定義一個含多個元素的有序數組,在數組中找到某個元素。spa例如:定義一個數組arr[] == {1,2,3,4,5,6,7,8,9,10},在數組中找到元素7並肯定其數組下標。3d
首先,我想到的代碼是這樣的:code
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int k = 7; int i = 0; //用數組佔用字節長度除以數組首地址佔用字節長度,可得出數組元素個數 int sz = sizeof(arr) / sizeof(arr[0]); for(i=0; i<=sz; i++) { if (k == arr[i]) { printf("找到了,下標是%d\n",i); } else { printf("沒找到\n"); } } return 0; }
但結果倒是這樣blog
咱們須要的效果應該是尋找數組所有的元素後,在屏幕上打印是否找到元素的結果,而不是找一個元素輸出一個結果。
可知,代碼中的分支結構中缺乏break,因而改進代碼。
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int k = 7; int i = 0; int sz = sizeof(arr) / sizeof(arr[0]); //用數組佔用字節長度除以數組首地址佔用字節長度,可得出數組元素個數 //從數組中全部元素中一個個查找,因此i<=sz for(i=0; i<=sz; i++) { if (k == arr[i]) { printf("找到了,下標是%d\n",i); break; } } if(i == sz) printf("沒找到\n"); return 0; }
自此,咱們已經能成功在數組中尋找相關元素。
*2、折半查找算法*(二分法)
對與題目「在一個有序數組中查找具體的某個數字n」,當元素個數很少時,咱們可使用例題3中的解題思路;但咱們要思考,當數組元素特別多時,這樣從頭至尾一個個從數組檢查,有時候須要檢查n給元素才能得知結果,效率是比較低的,那麼咱們能不能經過改進代碼邏輯提升程序運行效率呢,這時,不得不提出二分法的概念。
折半查找算法:又稱二分查找算法,又稱二分法,即當有一已知最大值的一串有序數組,能夠經過不斷取中間值與所需尋找的元素相比較,排除一半數據,縮小搜索範圍,最終肯定元素的方法。好比咱們去買鞋,老闆告訴咱們最高200元,讓咱們猜,那麼理論上,價格能夠是0,1,2…200。通常狀況下,咱們會說100元,若是老闆說低了,那麼此時猜的範圍縮小爲100—200,直接排除了通常數據。此時,在進行下一步猜想,直到得出結果。
因而,代碼能夠改進爲:
int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int k = 7; int left = 0;//數組左下標 int right = sizeof(arr) / sizeof(arr[0]) - 1;//數組右下標 //用數組佔用字節長度除以數組首地址佔用字節長度,可得出數組元素個數,元素個數減一得數組右下標 while (left <= right) { int mid = (left + right) / 2;//必須放到循環內部,選取新的元素做中間值 if (arr[mid] < k) { left = mid + 1; } else if (arr[mid] > k) { right = mid - 1; } else { printf("找到了,下標是%d\n", mid); break; } } if (left > right)//left>right是,說明數組元素所有被尋找仍是沒找要找的元素 printf("沒找到\n"); return 0; }
解題思路:既然是多個字符從兩端移動,那麼就應該有兩個數組,一個表示演示的字符串,一個表示不輸出字符串時須要輸出的字符串。
注意:1. 字符串結束\0算一個小標,用sizeof要-2
2. 也可用strlen
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <windows.h> #include <stdlib.h> int main() { char arr1[] = "hello,world"; char arr2[] = "###########"; int left = 0;//數組左值 int i = 0; //由於字符串的結束是'\n',數組下標從0開始(與數組個數差一),所以用sizeof計算是應該減2 //int right = sizeof(arr2) / sizeof(arr2[0])-2; int right = strlen(arr1) - 1;//數組長度減一,strlen不會計算'\n' while (left <= right) { arr2[left] = arr1[left];//將arr1中左邊的字符傳遞給arr2 arr2[right] = arr1[right];//將arr1中右邊的字符傳遞給arr2 printf("%s\n", arr2); Sleep(1000);//延遲函數,單位爲ms system("cls");//執行系統命令的一個函數-cls-清空屏幕 left++; right --; } printf("hello, world\n"); return 0; }
效果以下:
編寫代碼實現,模擬用戶登陸情景,而且只能登陸三次。(只容許輸入三次密碼,若是密碼正確則 提示登陸成,若是三次均輸入錯誤,則退出程序。
int main() { int i = 0; char password[] = "123456"; for (i = 0; i < 3; i++) { printf("請輸入密碼: "); scanf("%s", password); if (strcmp(password ,"123456")==0) //== 不能用來比較兩個字符串是否相等,應該使用一個庫函數-strcmp { printf("輸入正確,登陸成功\n"); break; } else { printf("密碼錯誤\n"); } } if (i == 3) { printf("三次輸入錯誤,退出程序\n"); } return 0; }
效果如圖:
goto語句能夠直接跳轉到設定的位置,但易形成程序邏輯錯誤,較少用。
//goto語言,30s關機程序 int main() { char input[20] = { 0 }; system("shutdown -s -t 30");//設置30s關機 again: printf("你的電腦將在30s後關機,請輸入:我是豬,取消關機\n"); scanf("%s", &input); if (strcmp(input, "我是豬") == 0)//設置取消關機的判斷條件 { system("shutdown -a");//取消關機 printf("你已取消關機\n"); } else { goto again; } return 0; }