前言:
通過對(duì)藍(lán)橋杯真題回文數(shù)字的講解,引出關(guān)于三種回文判斷的方式:數(shù)組或字符串、棧、直接反轉(zhuǎn)數(shù)字。
目錄
前言:
藍(lán)橋杯題目:回文數(shù)字
題目分析:
一、數(shù)組或字符串判斷回文:
二、利用棧的數(shù)據(jù)結(jié)構(gòu)判斷回文:
三、直接反轉(zhuǎn)數(shù)字
藍(lán)橋杯題目:回文數(shù)字
觀察數(shù)字:12321,123321? 都有一個(gè)共同的特征,無論從左到右讀還是從右向左讀,都是相同的。這樣的數(shù)字叫做:回文數(shù)字。
本題要求你找到一些5位或6位的十進(jìn)制數(shù)字。滿足如下要求:
該數(shù)字的各個(gè)數(shù)位之和等于輸入的整數(shù)。
題目分析:
根據(jù)題目要求,我們了解到我們需要進(jìn)行判斷操作的數(shù)的范圍是五位數(shù)到六位數(shù),即10000到999999,也就是我們首先要生成這些數(shù)字,其次這些數(shù)字需要滿足兩個(gè)條件。
第一個(gè)條件:個(gè)數(shù)位之和等于我們輸入的整數(shù);
第二個(gè)條件:回文。
所以我們根據(jù)以上分析進(jìn)行代碼實(shí)現(xiàn)。
一、數(shù)組或字符串判斷回文:
int main()
{
int n = 0;
scanf("%d", &n);
int num = 0;
//生成數(shù)字
for (num = 10000; num <= 999999; num++)
{
int tmp = num;
int sum = 0;
int count = 0;
//計(jì)算位數(shù)之和
while(tmp)
{
sum += tmp % 10;
tmp /= 10;
//統(tǒng)計(jì)位數(shù)
count++;
}
//判斷回文
int arr[6] = { 0 };
tmp = num;
int i = 0;
for (i = 0; i < count; i++)
{
arr[i] = tmp % 10;
tmp /= 10;
}
int flag = 1;
for (i = 0; i < count / 2; i++)
{
if (arr[i] != arr[count - i - 1])
flag = 0;
}
//判斷是否同時(shí)滿足兩個(gè)條件,并輸出
if (sum == n && flag==1)
{
printf("%d\n", num);
}
}
return 0;
}
二、利用棧的數(shù)據(jù)結(jié)構(gòu)判斷回文:
我們知道棧的特性是先入后出,即先進(jìn)入的元素后出,那么判斷回文恰恰可以利用棧這一特性,將前面一般的元素入棧后,再依次出棧與后面一半的元素相比較,如果相同,那么就說明這串字符為回文字符。
代碼如下:
int main()
{
int n = 0;
scanf("%d", &n);
int num = 0;
//生成數(shù)字
for (num = 10000; num <= 999999; num++)
{
int tmp = num;
int sum = 0;
int count = 0;
//計(jì)算位數(shù)之和
while (tmp)
{
sum += tmp % 10;
tmp = tmp / 10;
//統(tǒng)計(jì)位數(shù)
count++;
}
int flag = 1;
//判斷回文
SeqStack s;
//將前一半字符入棧
for (i = 0; i < count / 2; i++)
{
Push(s, str[i]);
}
if (count % 2) // 若輸入字符為奇數(shù)個(gè)時(shí)自動(dòng)跳過中間的字符
i++;
while (!EmptyStack(s))
{
Pop(s, e);
if (e!= str[i])
{
flag = 0;
break;
}
else
i++;
}
//判斷是否同時(shí)滿足兩個(gè)條件,并輸出
if (sum == n && flag == 1)
{
printf("%d\n", num);
}
}
return 0;
}
三、直接反轉(zhuǎn)數(shù)字:
直接反轉(zhuǎn)數(shù)字的方法是一種很巧妙的方法,他的思想可以理解為取某個(gè)整數(shù)每一位的逆過程,我們知道想要的到某個(gè)整數(shù)的每一位只需要每次%10,再/10即可,那么直接反轉(zhuǎn)數(shù)字的方法就是該過程的逆過程,代碼實(shí)現(xiàn)也非常簡單。
int main()
{
int n;
int flag = 0;
scanf("%d", &n);
int num = 0;
for (num = 10000; num <=999999; num++)
{
//創(chuàng)建臨時(shí)變量tmp,循環(huán)中利用tmp進(jìn)行操作,不會(huì)影響num的值
int tmp = num;
int t = 0;
int sum = 0;
while (tmp)
{
//這里t計(jì)算得到的值就是該串字符反轉(zhuǎn)后的值
t = t * 10 + tmp % 10;
sum += tmp % 10;
tmp /= 10;
}
if (t == num && sum == n)
{
flag = 1;
printf("%d\n", num);
}
}
return 0;
}
這個(gè)代碼最重要的思想就是? ?t = t * 10 + tmp % 10;文章來源:http://www.zghlxwxcb.cn/news/detail-488758.html
掌握后在進(jìn)行回文判斷上十分簡單,并且這種方式的時(shí)間復(fù)雜度與空間復(fù)雜度相較前兩種方式都有了顯著提高。文章來源地址http://www.zghlxwxcb.cn/news/detail-488758.html
到了這里,關(guān)于【藍(lán)橋杯】1434:回文數(shù)字—>三種判斷回文的方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!