目錄關(guān)于C語言的一些基礎(chǔ)經(jīng)典題目放在專欄:[C語言刷題]
創(chuàng)新互聯(lián)為您提適合企業(yè)的網(wǎng)站設(shè)計?讓您的網(wǎng)站在搜索引擎具有高度排名,讓您的網(wǎng)站具備超強的網(wǎng)絡(luò)競爭力!結(jié)合企業(yè)自身,進行網(wǎng)站設(shè)計及把握,最后結(jié)合企業(yè)文化和具體宗旨等,才能創(chuàng)作出一份性化解決方案。從網(wǎng)站策劃到成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè), 我們的網(wǎng)頁設(shè)計師為您提供的解決方案。
小菜坤日常上傳gitee代碼:https://gitee.com/qi-dunyan
???
個人簡介:雙一流非科班的一名小白,期待與各位大佬一起努力!
推薦網(wǎng)站:cplusplus.com
首先我們要知道什么是楊輝三角,如下:
思路:
我們可以看到,三角的兩邊都是1,并且從第二行(從0開始算)開始,兩邊之間的數(shù)字,都是上一行的兩位數(shù)字之和,比如第三行的數(shù)字3,等于上一行的1+2,等等。如此,把它看成一個二維數(shù)組,便可直接入手
#include// 1
// 1 1
// 1 2 1
// 1 3 3 1
// 1 4 6 4 1
int main()
{int arr[10][10] = {0 };
int i = 0;
int j = 0;
int n = 0;
scanf("%d", &n);
for (i = 0; i< n; i++)
{for (j = 0; j<= i; j++)
{ //第0列都是1
if (j == 0)
arr[i][j] = 1;
//每一行的最后一列也都是1
if (i == j)
arr[i][j] = 1;
//其余的就=上一行的兩位數(shù)之和
if (i >= 2 && j< i && j>0)
arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
}
}
//打印空格
for (i = 0; i< n; i++)
{//先打印這一行的空格
for (j = 0; j< n - i; j++)
{ printf(" ");
}
//然后打印這一行的數(shù)字
for (j = 0; j<= i; j++)
{ printf("%d ", arr[i][j]);
}
//換行
printf("\n");
}
return 0;
}
2、有序序列合并輸入兩個升序排列的序列,將兩個序列合并為一個有序序列并輸出。
數(shù)據(jù)范圍: 1≤n,m≤1000 , 序列中的值滿足 0≤val≤30000
輸入描述:
輸入包含三行第一行包含兩個正整數(shù)n, m,用空格分隔。n表示第二行第一個升序序列中數(shù)字的個數(shù),m表示第三行第二個升序序列中數(shù)字的個數(shù)。
第二行包含n個整數(shù),用空格分隔。
第三行包含m個整數(shù),用空格分隔。
輸出描述:
輸出為一行,輸出長度為n+m的升序序列,即長度為n的升序序列和長度為m的升序序列中的元素重新進行升序序列排列合并。
方法一:題目沒有考慮到時間復(fù)雜度,這里最簡單粗暴的就是將兩次輸入的數(shù)據(jù)放在一個m+n的數(shù)組里,然后再進行冒泡排序。如下:
#include//有序序列合并
//把兩次輸入的都放到同一個數(shù)組,然后對它進行冒泡排序
int main()
{int n = 0;
int m = 0;
scanf("%d %d", &n, &m);
int arr[2000];
int i = 0;
int j = 0;
for (i = 0; i< n; i++)
{scanf("%d", &arr[i]);
}
//下標從n開始,一直到n+m-1,一共m個元素
for (i = n; i< m + n; i++)
{scanf("%d", &arr[i]);
}
//冒泡排序//趟數(shù)
for (i = 0; i< n + m; i++)
{for (j = 0; j< n + m - 1 - i; j++)
{//兩兩相鄰元素比較
if (*(arr + j) >*(arr + j + 1))
{int min = *(arr + j + 1);
*(arr + j + 1) = *(arr + j);
*(arr + j) = min;
}
}
}
//打印
for (i = 0; i< m + n; i++)
{printf("%d ", *(arr + i));
}
return 0;
}
方法二:分別存放在兩個數(shù)組里,然后進行比較,將數(shù)據(jù)小的元素輸出,然后下標++,但是需要考慮到兩種特殊情況,就是一個數(shù)組已經(jīng)輸出完了,另一個還沒輸出完,完整實現(xiàn)代碼如下:
#includeint main()
{int n = 0;
int m = 0;
int arr1[1000];
int arr2[1000];
int i = 0;
int j = 0;
scanf("%d %d", &n, &m);
for (i = 0; i< n; i++)
{scanf("%d", &arr1[i]);
}
for (j = 0; j< m; j++)
{scanf("%d", &arr2[j]);
}
i = 0, j = 0;
while (i< n && j< m)
{//輸出小的
if (arr1[i]< arr2[j])
{ printf("%d ", arr1[i]);
i++;//下標++繼續(xù)比較
}
else if (arr1[i] >= arr2[j])
{ printf("%d ", arr2[j]);
j++;//++繼續(xù)比較
}
}
//當i==n時,說明arr1已經(jīng)輸出完了,直接把剩下的arr2輸出即可
if (i == n)
{for (; j< m; j++)
{ printf("%d ", arr2[j]);
}
}
//j==m時,說明arr2已經(jīng)輸出完了,直接把剩下的arr1輸出即可
else if (j == m)
{for (; i< n; i++)
{ printf("%d ", arr1[i]);
}
}
return 0;
}
兩種方法都可以實現(xiàn),方法一思路簡單,直接粗暴的解決,方法二的時間復(fù)雜度要低于方法一,因此,假如考慮到時間復(fù)雜度的情況下,方法二優(yōu)先。
3、有序序列插入一個數(shù)題目:有一個有序數(shù)字序列,從小到大排序,將一個新輸入的數(shù)插入到序列中,保證插入新數(shù)后,序列仍然是升序。
輸入描述:
第一行輸入一個整數(shù)(0≤N≤50)。
第二行輸入N個升序排列的整數(shù),輸入用空格分隔的N個整數(shù)。
第三行輸入想要進行插入的一個整數(shù)。
輸出描述:
輸出為一行,N+1個有序排列的整數(shù)。
思路:最簡單的思路就是與上面相同,將插入的數(shù)放在同一個數(shù)組,然后直接qsort或者冒泡排序,簡單粗暴。這里我采用了qsort(不會的或者已經(jīng)遺忘的老鐵可以去前面的文章復(fù)習(xí)一下)
#include#include//比較
int cmp(const void* e1, const void* e2) {return *(int*)e1 - *(int*)e2;
}
//打印
void print(int* arr, int N) {int i = 0;
for (i = 0; i<= N; i++) {printf("%d ", arr[i]);
}
}
int main()
{int arr[50] = {0 };
int N = 0;
int i = 0;
scanf("%d", &N);
for (i = 0; i< N; i++) {scanf("%d", &arr[i]);
}
scanf("%d", &arr[N]);
//qsort排序
qsort(arr, N+1, sizeof(arr[0]), cmp);
print(arr, N);
return 0;
}
4、調(diào)整奇數(shù)偶數(shù)順序題目:
輸入一個整數(shù)數(shù)組,實現(xiàn)一個函數(shù),
來調(diào)整該數(shù)組中數(shù)字的順序使得數(shù)組中所有的奇數(shù)位于數(shù)組的前半部分
所有偶數(shù)位于數(shù)組的后半部分
思路:這里題目沒有說要保持相對位置不變,所以我們只需要將偶數(shù)與奇數(shù)分離即可
定義兩個指針,一個指向首元素地址,另一個指向末元素地址
在有效范圍內(nèi),一個從前往后找,找到偶數(shù)停止,另一個從后往前,直到找到奇數(shù)停止
當兩者都停止時交換位置,繼續(xù)循環(huán)
如下圖(p1
代碼實現(xiàn):
#includevoid swap(int* arr, int sz)
{int left = 0;
int right = sz - 1;
while (left< right)
{//從前往后,找到偶數(shù)停止
while ((left< right) && (*(arr + left) % 2 == 1))
{ left++;
}
//從后往前,找到奇數(shù)停止
while ((left< right) && (*(arr + right) % 2 == 0))
{ right--;
}
//兩者交換
if (left< right)
{ int tmp = *(arr + left);
*(arr + left) = *(arr + right);
*(arr + right) = tmp;
}
}
//打印
int i = 0;
for (i = 0; i< sz; i++)
{printf("%d ", *(arr + i));
}
}
int main()
{int arr[] = {1,9,80,5,4,68,78,45,2,456,5,1,3,87,9,88,51,20 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
swap(arr, sz);
return 0;
}
5、修改數(shù)字—偶數(shù)改為0,奇數(shù)改為1小樂樂喜歡數(shù)字,尤其喜歡0和1。他現(xiàn)在得到了一個數(shù),想把每位的數(shù)變成0或1。如果某一位是奇數(shù),就把它變成1,如果是偶數(shù),那么就把它變成0。請你回答他最后得到的數(shù)是多少。
這里我們通過實際數(shù)字進行分析,比如數(shù)字123,分析如下:
代碼實現(xiàn):
#include#includeint main()
{int n=0;
int tmp=0;
int sum=0;
int cont=0;//統(tǒng)計位數(shù)
scanf("%d",&n);
do
{tmp=n%10;//得到尾數(shù)
if(tmp%2 !=0)
tmp=(int)1*pow(10,cont);
else
tmp=(int)0*pow(10,cont);
sum+=tmp;//每次相加
cont++;
}while(n/=10);
//打印即可
printf("%d",sum);
return 0;
}
6、猜名次5位運動員參加了10米臺跳水比賽,有人讓他們預(yù)測比賽結(jié)果:
A選手說:B第二,我第三;
B選手說:我第二,E第四;
C選手說:我第一,D第二;
D選手說:C最后,我第三;
E選手說:我第四,A第一;
比賽結(jié)束后,每位選手都說對了一半,請編程確定比賽的名次
思路,把所有可能都列舉出來,然后挑選符合題目要求的即可
#includeint main()
{int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 0;
//窮舉
for (a = 1; a<= 5; a++)
{for (b = 1; b<= 5; b++)
{ for (c = 1; c<= 5; c++)
{ for (d = 1; d<= 5; d++)
{for (e = 1; e<= 5; e++)
{if ((b == 2) + (a == 3) == 1 &&
(b == 2) + (e == 4) == 1 &&
(c == 1) + (d == 2) == 1 &&
(c == 5) + (d == 3) == 1 &&
(e == 4) + (a == 1) == 1
)
{//所有的可能中,只有1,2,3,4,5這五個不同的排名名次,只有這個才符合答案
if (a * b * c * d * e == 120 && a + b + c + d + e == 15)
{ printf("a=%d b=%d c=%d d=%d e=%d\n", a, b, c, d, e);//a=3 b=1 c=5 d=2 e=4
}
}
}
}
}
}
}
return 0;
}
7、猜兇手日本某地發(fā)生了一件謀殺案,警察通過排查確定殺人兇手必為4個嫌疑犯的一個。
以下為4個嫌疑犯的供詞:
A說:不是我。
B說:是C。
C說:是D。
D說:C在胡說
已知3個人說了真話,1個人說的是假話。
現(xiàn)在請根據(jù)這些信息,寫一個程序來確定到底誰是兇手。
與上面的題思路一樣,列舉所有可能,然后只會存放在一種是符合題意的
#includeint main()
{//兇手
char killer = '0';
//ABCD中的一個,列舉所有可能
for (killer = 'A'; killer<= 'D'; killer++)
{//有三個是真的
if ((killer != 'A') + (killer == 'C') + (killer == 'D') + (killer != 'D') == 3)
{ printf("%c\n", killer); //C
}
}
return 0;
}
8、字符串逆序單詞并打印將一句話的單詞進行倒置,標點不倒置。比如 I like beijing. 經(jīng)過函數(shù)后變?yōu)椋篵eijing. like I
輸入描述:
每個測試輸入包含1個測試用例: I like beijing. 輸入用例長度不超過100
輸出描述:
依次輸出倒置之后的字符串,以空格分割
示例1:
輸入
I like beijing.
輸出
beijing. like I
不使用庫函數(shù)strlen等
思路:這里介紹的是三指針兩次反轉(zhuǎn)法,比如 I like beijing.
第一次反轉(zhuǎn)(每個單詞)I ekil .gnijieb
第二次反轉(zhuǎn) (整個)beijing. like I
由于這里不讓用庫函數(shù),所以這里用來計算整個字符串長度的strlrn用不了,但自己可以寫一個
代碼實現(xiàn)
#include#include
//模擬實現(xiàn)strlen
int is_mystrlen(const char*arr)
{assert(arr);
int count = 0;
while (*(arr++))
{count++;
}
return count;
}
//反轉(zhuǎn)
void reserve(char* left, char* right)
{assert(left);
assert(right);
while (left< right)
{char tmp = *(left);
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{char arr[101];
gets(arr);
//數(shù)組名首元素地址
char* cut = arr;
//遇到\0結(jié)束
while (*cut)
{char* star = cut;
char* end = cut;
while (*end != ' ' && *end !='\0')
{ end++;
}
//反轉(zhuǎn)
reserve(star, end - 1);
if (*end != '\0')
cut = end + 1;
else
cut = end;
}
//計算字符串長度
int count_ = is_mystrlen(arr);
//反轉(zhuǎn)整個字符串
reserve(arr, arr + count_-1 );
printf("%s", arr);
return 0;
}
9、字符串左旋實現(xiàn)一個函數(shù),可以左旋字符串中的k個字符。
例如:
ABCD左旋一個字符得到BCDA
ABCD左旋兩個字符得到CDAB
思路:旋轉(zhuǎn)k次,每次旋轉(zhuǎn)一個字符,k取模,防止不必要的旋轉(zhuǎn)
代碼實現(xiàn):
#include#includevoid leftRound(char* src, int time)
{int i, j, tmp;
int len = strlen(src);
time %= len; //長度為5的情況下,旋轉(zhuǎn)6、11、16...次相當于1次,7、12、17...次相當于2次,以此類推。
for (i = 0; i< time; i++) //執(zhí)行k次的單次平移
{tmp = src[0];
for (j = 0; j< len - 1; j++) //單次平移
{ src[j] = src[j + 1];
}
//再把頭賦值到尾
src[j] = tmp;
}
}
int main()
{int k = 0;
char arr[1000] = {0 };
scanf("%s %d", arr,&k);
leftRound(arr, k);
printf("%s", arr);
return 0;
}
10、判斷字符串旋轉(zhuǎn)結(jié)果寫一個函數(shù),判斷一個字符串是否為另外一個字符串旋轉(zhuǎn)之后的字符串。
例如:給定s1 =AABCD和s2 = BCDAA,返回1
給定s1=abcd和s2=ACBD,返回0.
AABCD左旋一個字符得到ABCDA
AABCD左旋兩個字符得到BCDAA
AABCD右旋一個字符得到DAABC
思路:和上個題是一樣的,這里把它所有旋轉(zhuǎn)的可能列舉出來,然后用strcmp函數(shù)進行比較即可。
代碼實現(xiàn):
#include#include#include
int reverse(char* arr1, char* arr2)
{assert(arr1 && arr2);
int len1 = strlen(arr1);
int len2 = strlen(arr2);
//長度不相等,肯定不是旋轉(zhuǎn)后的
if (len1 != len2)
return 0;
int i = 0;
int j = 0;
//把所有可能都旋轉(zhuǎn)
for (i = 0; i< len1; i++)
{char p = *arr1;
for (j = 0; j< len1 - 1; j++)
{ *(arr1 + j) = *(arr1 + j + 1);
}
*(arr1 + len1 - 1) = p;
//strcmp比較字符串,==0表示相等
if (strcmp(arr1, arr2) == 0)
{ //相等返回1
return 1;
}
}
//如果經(jīng)歷循環(huán)后還沒返回,說明不相等,返回0
return 0;
}
int main()
{char arr1[] = "abcdefg";
char arr2[] = "defgabc";
//兩個字符串
int ret = reverse(arr1, arr2);
//返回1表示相等,可打印YES看一下
if (ret == 1)
printf("YES");
else
printf("NO");
return 0;
}
end
生活原本沉悶。但跑起來就會有風(fēng)!🌹
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧