真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

【C語言經(jīng)典例題】——程序員必須會的經(jīng)典基礎(chǔ)例題(三)-創(chuàng)新互聯(lián)

關(guān)于C語言的一些基礎(chǔ)經(jīng)典題目放在專欄:[C語言刷題]
小菜坤日常上傳gitee代碼:https://gitee.com/qi-dunyan
???
個人簡介:雙一流非科班的一名小白,期待與各位大佬一起努力!
推薦網(wǎng)站:cplusplus.com
在這里插入圖片描述

創(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è)計師為您提供的解決方案。

目錄
  • 1、楊輝三角
  • 2、有序序列合并
  • 3、有序序列插入一個數(shù)
  • 4、調(diào)整奇數(shù)偶數(shù)順序
  • 5、修改數(shù)字—偶數(shù)改為0,奇數(shù)改為1
  • 6、猜名次
  • 7、猜兇手
  • 8、字符串逆序單詞并打印
  • 9、字符串左旋
  • 10、判斷字符串旋轉(zhuǎn)結(jié)果

1、楊輝三角

首先我們要知道什么是楊輝三角,如下:
在這里插入圖片描述
思路:
我們可以看到,三角的兩邊都是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)查看詳情吧


當前題目:【C語言經(jīng)典例題】——程序員必須會的經(jīng)典基礎(chǔ)例題(三)-創(chuàng)新互聯(lián)
文章路徑:http://weahome.cn/article/ihdhh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部