1. 計(jì)算 n 的階乘
階乘
- 某個(gè)數(shù)從 1 開始一直乘到這個(gè)數(shù)本身為止;
- 例如:3 的階乘就是 1 * 2 * 3 = 6;
- n 的階乘就是 1 * 2 * 3 … * n。
解題思路
- 如果想要階乘到 n 的話,就要產(chǎn)生 1-n 的數(shù)字,此時(shí)就需要用到循環(huán)。
- 通過循環(huán)產(chǎn)生 1-n 的數(shù)字,然后把這些數(shù)字累積乘到一個(gè)數(shù)上。
代碼實(shí)現(xiàn)文章來源:http://www.zghlxwxcb.cn/news/detail-515846.html
#include <stdio.h>
int main()
{
int n, i;
int ret = 1;//產(chǎn)生的1-n的數(shù)字要累乘到ret上存起來,所以ret必須初始化為1
scanf("%d", &n);
for (i = 1; i <= n; i++)//產(chǎn)生 1-n 的數(shù)字
{
ret *= i;//將不斷產(chǎn)生的 1-n 的數(shù)字累乘到 ret 上
}
printf("%d\n", ret);
return 0;
}
2. 計(jì)算 1!+2!+3!+……+10!
解題思路
- 和上一題一樣分別計(jì)算從 1-10 的每個(gè)數(shù)的階乘,并把這些數(shù)全部累加到一個(gè)變量上去。
代碼實(shí)現(xiàn)
#include <stdio.h>
int main()
{
int sum = 0,ret = 1;
int i, n;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
ret *= i;//產(chǎn)生從 1-n 的階乘并且存到 ret 中
sum += ret;//將每次產(chǎn)生的階乘的結(jié)果累加到 sum 中去
}
printf("%d\n", sum);
return 0;
}
3. 使用二分查找法查找某數(shù)
題目?jī)?nèi)容
- 在一個(gè)有序數(shù)組中查找具體的某個(gè)數(shù)字 n。
二分查找算法介紹
二分查找
- 每次將待查記錄所在區(qū)間縮小一半;
- 只對(duì)已經(jīng)排序的數(shù)據(jù)有效。
查找過程
- 當(dāng)前數(shù)組內(nèi)的數(shù)據(jù)元素是按照升序排序的。
- 設(shè)置一個(gè)查找區(qū)間初始值,low 指向第一個(gè)元素,high 指向最后一個(gè)元素。
- 當(dāng) low <= high 時(shí),循環(huán)執(zhí)行以下操作:
- 設(shè)一個(gè) mid 為 low 和 high 的中間值:mid = (low + high) / 2,當(dāng)前這個(gè)數(shù)組的 mid 是下標(biāo) 6 的元素 56。
- 直接將要找的這個(gè)關(guān)鍵字的值 21 和 和中間位置的這個(gè)值比較一下,發(fā)現(xiàn) 21 < 56,說明要找的值一定在 mid 的左半邊區(qū)域。要將查找范圍更新到 mid 左邊。
- 則將新的 high 更新為:key < mid 則:high = mid - 1,因?yàn)橹虚g位置56比較過了,不是這家伙。
- 繼續(xù)拿 mid 的值和 21 比較,發(fā)現(xiàn) 19 < 21,說明待查找的值在 mid 的右邊,將 low 更新,key > mid 則: low = mid +1。
- 然后再取找中間位置,low是 4 high 是 5,mid 的值就是4。
- 拿 key 的值 21 和 mid 的值比較,發(fā)現(xiàn) mid == key 則:return mid。
如果要找的值不在數(shù)組中
- 查找到最后 low 會(huì)大于 high 上下限交換了,此時(shí)說明數(shù)組中沒有俺們要找的數(shù)。
-
折半查找結(jié)束條件:high < low。
- 因?yàn)檫@樣就說明 high 和 low 之間已經(jīng)沒有元素可以被查找了。
二分查找特點(diǎn)
- 在數(shù)據(jù)越多的時(shí)候效率越高,假設(shè)要 40 億的數(shù)據(jù)中查找,第一次就能去掉20億的數(shù)據(jù)。
- 待查找的數(shù)據(jù)必須是有序的。
代碼實(shí)現(xiàn)
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);//計(jì)算數(shù)組中有多少個(gè)元素
int low = 0,high = sz - 1;//high指向的是最后一個(gè)元素的下標(biāo),所以要 sz -1
int n;
printf("請(qǐng)輸入要查找的數(shù):");
scanf("%d", &n);
while (low <= high)//這個(gè)循環(huán)條件說明兩者之間還有元素未被查找
{
int mid = (low + high) / 2;//這一步必須要寫進(jìn)循環(huán)里,不然 mid 無法更新
if (arr[mid] > n)//如果中間值大于要查找的值,則去 mid 的左半?yún)^(qū)域去找
{
high = mid-1;
}
else if (arr[mid] < n)//如果中間值小于要查找的值,則去 mid 的右半?yún)^(qū)域?qū)ふ?/span>
{
low = mid + 1;
}
else
{
printf("找到了,下標(biāo)是%d\n", mid);
break;//已經(jīng)找到了,再繼續(xù)找就沒意義了
}
}
if (low > high)//中間已經(jīng)沒有元素可以被查找了
{
printf("找不到了\n");
}
return 0;
}
4. 演示字符移動(dòng)
題目?jī)?nèi)容
- 編寫代碼,演示多個(gè)字符從兩端移動(dòng),向中間匯聚。
題目分析
- 假設(shè)最終要打印出 hello word!,要演示出的效果就是下面這樣;
***********
h*********!
he*******d!
hel*****rd!
hell***ord!
hello*word!
hello word!
解題思路
- 創(chuàng)建兩個(gè)數(shù)組,arr1 用來存 hello word!,arr2 用來存放 ***********。
- 找出兩個(gè)字符串?dāng)?shù)組最右端及最左端字符的數(shù)組下標(biāo)。
- 控制左右兩端的下標(biāo),將 arr1 左右兩端的字符從外向里,依次賦值到 arr2 對(duì)應(yīng)的位置上去。
代碼實(shí)現(xiàn)
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "hello word!";
char arr2[] = "***********";
int left = 0;
int right = strlen(arr1) - 1;//要拿到的是字符串?dāng)?shù)組的最后一個(gè)元素的下標(biāo)
printf("%s\n", arr2);
while(left<=right)//讓 arr1 數(shù)組中的左右兩端的元素向中間移動(dòng),然后依次賦給arr2
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
left++; right--;
printf("%s\n", arr2);
}
return 0;
}
5. 模擬用戶登錄場(chǎng)景
題目?jī)?nèi)容
-
編寫代碼實(shí)現(xiàn),模擬用戶登錄情景,并且只能登錄三次。(只允許輸入三次密碼,如果密碼正確則
提示登錄成功,如果三次均輸入錯(cuò)誤,則退出程序。
代碼實(shí)現(xiàn)
#include <stdio.h>
#include <string.h>
int main()
{
int i;
char arr1[] = "5201314";
char password[20];
for (i = 0; i < 3; i++)
{
printf("請(qǐng)輸入密碼:");
scanf("%s", password);//數(shù)組名已經(jīng)是地址了,此處不需要 &password 了
//使用 strcmp 來比較兩個(gè)字符串是否相等,引用頭文件 string.h
//如果兩個(gè)字符串相等,則 strcmp 的返回值為 0(假)
if (!strcmp(password, arr1))//如果相等則返回的是 0 (假),用 ! 把假變成真
{
printf("登錄成功\n");
break;
}
else
{
printf("密碼錯(cuò)誤,請(qǐng)重試\n");
}
}
if (3 == i)
{
printf("你已輸錯(cuò)3次,已退出程序!\n");
}
return 0;
}
文章來源地址http://www.zghlxwxcb.cn/news/detail-515846.html
到了這里,關(guān)于【C語言初階(5)】循環(huán)練習(xí)題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!