目前主要分為三個專欄,后續還會添加:
? ? ? ? 專欄如下:?? ? ? ? ? ? ? ??C語言刷題解析? ? ? ?C語言系列文章? ? ? ?我的成長經歷
感謝閱讀!
初來乍到,如有錯誤請指出,感謝!
描述
今天牛牛學到了回文串,他想在數字里面找回文,即回文數,回文數是正著讀與倒著讀都一樣的數,比如1221,343是回文數,433不是回文數。請輸出不超過n的回文數。
輸入描述:
輸入一個整數n(1 <= n <= 100000)
輸出描述:
從1開始按從小到大的順序輸出所有回文數
示例1
思路 :?
可以使用用數組存放數據的操作
將1-100000中所有的數字都遍歷出來
然后判斷數組的下標 是否相等
------------------------------------------------
操作起來有點復雜 還是用取模和取余運算吧
其中要注意的是 9999 99999 這種大的數字 9889 98889 這種也算是回文數
問題定義:
輸入:一個整數?𝑛n,范圍是?1≤𝑛≤1000001≤n≤100000。
輸出:所有不超過?𝑛n?的回文數,按從小到大的順序輸出。
算法設計:
遍歷:從 1 開始遍歷到?n,檢查每個數是否為回文數。
回文數檢查:對于每個數?x,我們可以通過以下步驟檢查它是否是回文數:
轉換為字符串:將整數?x?轉換為字符串。
反轉字符串:反轉字符串。
比較:比較原始字符串和反轉后的字符串是否相同。
優化:實際上,我們不需要將整個字符串反轉,只需要反轉一半,然后比較前半部分和后半部分是否相同。
數據結構選擇:
使用一個整數變量來存儲當前遍歷的數。
使用一個字符串來存儲整數的字符表示形式。
算法實現:
初始化:設置一個整數變量?i
?從 1 開始。
循環:使用?for
?循環遍歷從 1 到?n?的所有整數。
轉換為字符串:將當前整數?i
?轉換為字符串。
反轉字符串:編寫一個函數來反轉字符串的一半。
比較:比較原始字符串和反轉后的字符串。
輸出:如果相等,說明是回文數,輸出該數。
?代碼 1 :
/* 思路 : 可以使用用數組存放數據的操作將1-100000中所有的數字都遍歷出來然后判斷數組的下標 是否相等------------------------------------------------操作起來有點復雜 還是用取模和取余運算吧
*/// # include <stdio.h>
// int main ()
// {
// int a,b,c,d,e,f;// return 0;
// }# include <stdio.h>
int main ()
{int n = 0;scanf("%d",&n);for(int i=1;i<=n;i++){if (i<10) {printf("%d\n",i);}else if (i<100) {if (i%10==i/10) {printf("%d\n",i);}}else if (i<1000) {if (i%10==i/100) {printf("%d\n",i);}}else if (i<10000) {if (i%10==i/1000&&i/100%10==i/10%10) //9999 9889 包括這樣{printf("%d\n",i);}}else if (i<100000) {if (i%10==i/10000&&i/1000%10==i/10%10) //99999 98889{printf("%d\n",i);}}}return 0;
}
代碼 2 :
使用數組的方法來寫
int main ()
{int n,i,a,b[10],c=0;scanf("%d",&n);for(i=1;i<=n;i++){a=i;\\把數保存到一個變量中for(int k=0;;k++){b[k]=a%10;\\將每一位數保存到數組中a=a/10;c=c*10+b[k];if(a==0)break;}if(c==i)printf("%d\n",i);}return 0;
}
代碼 3 :
相對復雜
#include <stdio.h>
#include <string.h>char *my_itoa(int value, char *str, int radix)
{static char dig[] ="0123456789""abcdefghijklmnopqrstuvwxyz";int n = 0, neg = 0;unsigned int v;char *p, *q;char c;/* 負數:十進制直接在前面加負號,其它進制用補碼 */if (radix == 10 && value < 0){v = -value;neg = 1;}else{v = value;}/* 其它進制的負數轉為unsigned int類型,即取了補碼 */do{str[n++] = dig[v % radix];v /= radix;} while (v);if (neg)str[n++] = '-';str[n] = '\0';/* 字符串反轉 */for (p = str, q = p + (n - 1); p < q; ++p, --q)c = *p, *p = *q, *q = c;return str;
}void fun(long n)
{char num[7];int i, j;my_itoa(n, num, 10); //將整形n,以十進制存入num中;for (i = 0, j = strlen(num) - 1; i <= j; i++, j--){if (num[i] != num[j])break;}if (i >= j){printf("%d ", n);}
}int main()
{long n = 0;long i = 0;scanf("%ld", &n); // 12321;for (i = 1; i <= n; i++)fun(i);return 0;
}
擴展:取模與取余
m % 10
:取模運算,用于獲取數字m
的最低位。
m /= 10
:整數除法運算,用于去掉數字m
的最低位。
之前文章里面有提過
這里就不贅述了
??