C語(yǔ)言算法練習(xí)之抓交通肇事犯
1. 問(wèn)題描述
一輛卡車違反交通規(guī)則,撞人后逃跑?,F(xiàn)場(chǎng)有三人目擊該事件,但都沒有記住車號(hào),只記下車號(hào)的一些特征。
甲說(shuō):牌照的前兩位數(shù)字是相同的;
乙說(shuō):牌照的后兩位數(shù)字是相同的,但與前兩位不同;
丙是數(shù)學(xué)家,他說(shuō):四位的車號(hào)剛好是一個(gè)整數(shù)的平方。
請(qǐng)根據(jù)以上線索求出車號(hào)。
2. 題目分析
按照題目的要求造出一個(gè)前兩位數(shù)相同、后兩位數(shù)相同且相互間又不同的 4 位整數(shù),然后判斷該整數(shù)是否是另一個(gè)整數(shù)的平方。
即求一個(gè)四位數(shù) a 1、a 2 、a 3、 a 4,滿足如下的條件:

3. 算法設(shè)計(jì)
該題目是數(shù)值計(jì)算問(wèn)題,求解不定方程。
對(duì)于這種求解不定方程組的問(wèn)題,一般采用窮舉循環(huán)。
首先設(shè)計(jì)雙層循環(huán)窮舉出所有由前兩位數(shù)和后兩位數(shù)組成的 4 位數(shù)車牌;
然后在最內(nèi)層窮舉出所有平方后值為 4 位數(shù)并且小于車牌號(hào)的數(shù);
最后判斷該數(shù)是否與車牌相等,若相等則打印車牌。
4. 流程框架
程序流程圖如下所示


?? 判斷車牌 k 是否為某個(gè)整數(shù)的平方
再次利用循環(huán)來(lái)實(shí)現(xiàn),循環(huán)變量 temp 求平方與車牌號(hào) k 比較,如相等則找到車牌號(hào)。
優(yōu)化算法,temp 的初值應(yīng)該從 31 開始,因?yàn)樾∮?0的數(shù)的平方小于 4 位數(shù),因此該層循環(huán)為最內(nèi)層循環(huán),對(duì)每一個(gè)車牌號(hào)均做如此操作。

5. 代碼實(shí)現(xiàn)
完整代碼??
int main()
{
int i = 0;//i代表前兩位車牌號(hào)數(shù)字
int j = 0;//j代表后兩位車牌號(hào)數(shù)字
int k = 0;//k代表車牌號(hào)
int temp = 0;
for (i = 0; i <= 9; i++)
{
for (j = 0; j <= 9; j++)
{
//判斷前兩位數(shù)和后兩位數(shù)字是否不同
if (i != j)
{
//組成4位車牌號(hào)
k = 1000 * i + 100 * i + 10 * j + j;
//判斷k是否是某個(gè)數(shù)的平方,若是則輸出k
for (temp = 31; temp <= 99; temp++)
{
if (temp * temp == k)
{
printf("車牌號(hào)為:%d\n", k);
}
}
}
}
}
return 0;
}運(yùn)行結(jié)果??

6. 算法升級(jí)
針對(duì)上述程序如果已經(jīng)找到相應(yīng)的車牌號(hào),請(qǐng)思考循環(huán)是否還需要繼續(xù)呢? 答案是肯定的,因?yàn)樗惴ㄔ谠O(shè)計(jì)窮舉循環(huán)的時(shí)候,并沒有在找到車牌的時(shí)候就退出循環(huán),而是繼續(xù)窮舉其他 i、j 的情況。 我們可以改進(jìn)算法,設(shè)置一個(gè) 標(biāo)識(shí)變量,該變量初值為 0,一旦找到車牌號(hào),則改變?cè)摌?biāo)識(shí)變量的值為 1,每次循環(huán)判斷一下標(biāo)識(shí)變量的值,如果值為 1 則退出所有循環(huán),這樣能有效地減少循環(huán)次數(shù)。
改進(jìn)程序如下??
int main()
{
int i = 0;//i代表前兩位車牌號(hào)數(shù)字
int j = 0;//j代表后兩位車牌號(hào)數(shù)字
int k = 0;//k代表車牌號(hào)
int temp = 0;
int flag = 0;//標(biāo)識(shí)符置為0
for (i = 0; i <= 9; i++)
{
//判斷標(biāo)識(shí)變量
if (flag)
break;
for (j = 0; j <= 9; j++)
{
//判斷標(biāo)識(shí)變量
if (flag)
break;
//判斷前兩位數(shù)和后兩位數(shù)字是否不同
if (i != j)
{
//組成4位車牌號(hào)
k = 1000 * i + 100 * i + 10 * j + j;
//判斷k是否是某個(gè)數(shù)的平方,若是則輸出k
for (temp = 31; temp <= 99; temp++)
{
if (temp * temp == k)
{
printf("車牌號(hào)為:%d\n", k);
flag = 1; //找到車牌后,標(biāo)識(shí)變量置為1
break; //強(qiáng)制退出到最內(nèi)層循環(huán)
}
}
}
}
}
return 0;
}到此這篇關(guān)于C語(yǔ)言算法練習(xí)之抓交通肇事犯的文章就介紹到這了,更多相關(guān)C語(yǔ)言 抓交通肇事犯內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++數(shù)據(jù)結(jié)構(gòu)之list詳解
list是一種序列式容器。list容器完成的功能實(shí)際上和數(shù)據(jù)結(jié)構(gòu)中的雙向鏈表是極其相似的,list中的數(shù)據(jù)元素是通過(guò)鏈表指針串連成邏輯意義上的線性表,也就是list也具有鏈表的主要優(yōu)點(diǎn),即:在鏈表的任一位置進(jìn)行元素的插入、刪除操作都是快速的2021-11-11
C++中賦值運(yùn)算符與逗號(hào)運(yùn)算符的用法詳解
這篇文章主要介紹了C++中賦值運(yùn)算符與逗號(hào)運(yùn)算符的用法詳解,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09
C++中std::chrono時(shí)間庫(kù)的全面解析
C++?std::chrono時(shí)間庫(kù)是C++標(biāo)準(zhǔn)庫(kù)提供的一個(gè)時(shí)間處理庫(kù),提供了一個(gè)方便、靈活和精確的時(shí)間處理工具,下面小編就帶大家深入了解一下std::chrono時(shí)間庫(kù)的使用吧2023-10-10
深入解析C++11?lambda表達(dá)式/包裝器/線程庫(kù)
這篇文章主要介紹了C++11?lambda表達(dá)式/包裝器/線程庫(kù)的相關(guān)知識(shí),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
C語(yǔ)言實(shí)現(xiàn)分治法實(shí)例
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)分治法的實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08

