C语言回文数的判断
# include <stdio.h>
# include <math.h>
int getLength(long int num){ /*定義函數(shù)計(jì)算num的位數(shù)*/int found , length ;found =0;length =10;if(num==0){return 1;}while(found==0){if(num/(int)pow(10,length-1)>0){ /*庫(kù)函數(shù)pow(10,length-1)的功能是計(jì)算 10 的(length-1)次冪*/found=1;}else{length=1;} }return (length); /*返回正整數(shù)的位數(shù)*/
}int isHuiWenShu(long int num){ /*判斷回文數(shù)函數(shù)*/long int n; /*定義變量n,保存從鍵盤(pán)輸入是正數(shù)*/int left; /*定義變量left,保存num最左邊的數(shù)字*/int right; /*定義變量right,保存num最右邊的數(shù)字*/int i; /*定義變量i,保存正整數(shù)的位數(shù)*/int flag; /*定義變量flag是不是回文數(shù)的標(biāo)志 flag=1不是回文數(shù)*/i=getLength(num); /*調(diào)用函數(shù)獲取輸入num的長(zhǎng)度 賦予變量i*/n=num;flag=0;while(i>1 && flag==0){left=n/(int)pow(10,i-1);right=n%10;n=n%(int)pow(10,i-1)/10;i-=2;if(left!=right){ //num最左邊和最右邊的數(shù)字不相等,表示不是回文數(shù)flag=1; //flag設(shè)置為1,表示不是回文數(shù)}}if(flag==0){ //return 1;}else{return 0;}
}int main(void){long int num;scanf("%ld",&num); /*輸入一個(gè)數(shù)字*/if(isHuiWenShu(num)){ /*調(diào)用函數(shù)判斷是不是一個(gè)回文數(shù)*/printf("%ld is a HuiWenShu\n",num); /*是一個(gè)回文數(shù)就打印*/}else{printf("%ld is not a HuiWenShu\n",num); /*不是一個(gè)回文數(shù)就打印*/}return 0;
}
?
?
Math.pow(x,y)使用注意事項(xiàng)
首先明確Math.pow(x,y)的作用就是計(jì)算x的y次方,其計(jì)算后是浮點(diǎn)數(shù),這里先看一個(gè)例子: 例1:153是一個(gè)非常特殊的數(shù),它等于它的每位數(shù)字的立方和,即153=1*1*1+5*5*5+3*3*3。編程求所有滿足這種條件的三位十進(jìn)制數(shù)。 輸出格式:按從小到大的順序輸出滿足條件的三位十進(jìn)制數(shù),每個(gè)數(shù)占一行。 public class Main {static int a ,b ,c;public static void function(){for(int i =100;i<1000;i++){a=i/100;b=i%10;c=(i/10)%10;if(Math.pow(a,3) + (Math.pow(b,3)) + (Math.pow(c, 3))==(i)){System.out.println(i);}/*if(a*a*a+b*b*b+c*c*c==i){//System.out.println(abc);System.out.println(i);*/}}public static void main(String [] args){function();} } 例2:Math.pow(x,y)這個(gè)函數(shù)是求x的y次方,x,y的值都是浮點(diǎn)類(lèi)型的,pow(64,1/3),64的1/3次方,如果口頭上來(lái)算的話,可以看成64的3次方根,但是計(jì)算機(jī)不會(huì)這樣算,他會(huì)先求出1/3的值,1/3中1和3均為int類(lèi)型,所以值為0,然后y這個(gè)值是浮點(diǎn)類(lèi)型,所以自動(dòng)轉(zhuǎn)換為0.0,任何數(shù)字的0次冪都為1,所有這個(gè)地方求出來(lái)的值為1,而不是4 例3:題目描述求出1~13的整數(shù)中1出現(xiàn)的次數(shù),并算出100~1300的整數(shù)中1出現(xiàn)的次數(shù)?為此他特別數(shù)了一下1~13中包含1的數(shù)字有1、10、11、12、13因此共出現(xiàn)6次,但是對(duì)于后面問(wèn)題他就沒(méi)轍了。ACMer希望你們幫幫他,并把問(wèn)題更加普遍化,可以很快的求出任意非負(fù)整數(shù)區(qū)間中1出現(xiàn)的次數(shù)。 import java.util.*; public class Solution {public int NumberOf1Between1AndN_Solution(int n) {if(n<0) {return 0;}int high,low,curr,tmp,i = 1;high = n;int total = 0;while(high!=0){high = n/(int)Math.pow(10, i);// 獲取第i位的高位tmp = n%(int)Math.pow(10, i);curr = tmp/(int)Math.pow(10, i-1);// 獲取第i位low = tmp%(int)Math.pow(10, i-1);// 獲取第i位的低位if(curr==1){total+= high*(int)Math.pow(10, i-1)+low+1;}else if(curr<1){total+=high*(int)Math.pow(10, i-1);}else{total+=(high+1)*(int)Math.pow(10, i-1);}i++;}return total; } } 分析:注意其中對(duì)其都進(jìn)行了強(qiáng)制類(lèi)型轉(zhuǎn)換,轉(zhuǎn)成了int,high = n/(int)Math.pow(10, i);/ 附:接下來(lái)分析一下這個(gè)題目:轉(zhuǎn)載自:https://www.nowcoder.com/profile/777651/codeBookDetail?submissionId=1503231先分析1,按照小于一、等于一、大于一分類(lèi),當(dāng)分析其他數(shù)字的時(shí)候也是這樣分析1. 如果第i位(自右至左,從1開(kāi)始標(biāo)號(hào))上的數(shù)字為0,則第i位可能出現(xiàn)1的次數(shù)由更高位決定(若沒(méi)有高位,視高位為0),等于更高位數(shù)字X當(dāng)前位數(shù)的權(quán)重10i-1。2. 如果第i位上的數(shù)字為1,則第i位上可能出現(xiàn)1的次數(shù)不僅受更高位影響,還受低位影響(若沒(méi)有低位,視低位為0),等于更高位數(shù)字X當(dāng)前位數(shù)的權(quán)重10i-1+(低位數(shù)字+1)。3. 如果第i位上的數(shù)字大于1,則第i位上可能出現(xiàn)1的次數(shù)僅由更高位決定(若沒(méi)有高位,視高位為0),等于(更高位數(shù)字+1)X當(dāng)前位數(shù)的權(quán)重10i-1。二、X的數(shù)目這里的 X∈[1,9] ,因?yàn)? X=0 不符合下列規(guī)律,需要單獨(dú)計(jì)算。首先要知道以下的規(guī)律:從 1 至 10,在它們的個(gè)位數(shù)中,任意的 X 都出現(xiàn)了 1 次。 從 1 至 100,在它們的十位數(shù)中,任意的 X 都出現(xiàn)了 10 次。 從 1 至 1000,在它們的百位數(shù)中,任意的 X 都出現(xiàn)了 100 次。 依此類(lèi)推,從 1 至 10 i ,在它們的左數(shù)第二位(右數(shù)第 i 位)中,任意的 X 都出現(xiàn)了 10 i?1 次。這個(gè)規(guī)律很容易驗(yàn)證,這里不再多做說(shuō)明。接下來(lái)以 n=2593,X=5 為例來(lái)解釋如何得到數(shù)學(xué)公式。從 1 至 2593 中,數(shù)字 5 總計(jì)出現(xiàn)了 813 次,其中有 259 次出現(xiàn)在個(gè)位,260 次出現(xiàn)在十位,294 次出現(xiàn)在百位,0 次出現(xiàn)在千位。現(xiàn)在依次分析這些數(shù)據(jù),首先是個(gè)位。從 1 至 2590 中,包含了 259 個(gè) 10,因此任意的 X 都出現(xiàn)了 259 次。最后剩余的三個(gè)數(shù) 2591, 2592 和 2593,因?yàn)樗鼈冏畲蟮膫€(gè)位數(shù)字 3 < X,因此不會(huì)包含任何 5。(也可以這么看,3<X,則個(gè)位上可能出現(xiàn)的X的次數(shù)僅由更高位決定,等于更高位數(shù)字(259)X101-1=259)。然后是十位。從 1 至 2500 中,包含了 25 個(gè) 100,因此任意的 X 都出現(xiàn)了 25×10=250 次。剩下的數(shù)字是從 2501 至 2593,它們最大的十位數(shù)字 9 > X,因此會(huì)包含全部 10 個(gè) 5。最后總計(jì) 250 + 10 = 260。(也可以這么看,9>X,則十位上可能出現(xiàn)的X的次數(shù)僅由更高位決定,等于更高位數(shù)字(25+1)X102-1=260)。接下來(lái)是百位。從 1 至 2000 中,包含了 2 個(gè) 1000,因此任意的 X 都出現(xiàn)了 2×100=200 次。剩下的數(shù)字是從 2001 至 2593,它們最大的百位數(shù)字 5 == X,這時(shí)情況就略微復(fù)雜,它們的百位肯定是包含 5 的,但不會(huì)包含全部 100 個(gè)。如果把百位是 5 的數(shù)字列出來(lái),是從 2500 至 2593,數(shù)字的個(gè)數(shù)與百位和十位數(shù)字相關(guān),是 93+1 = 94。最后總計(jì) 200 + 94 = 294。(也可以這么看,5==X,則百位上可能出現(xiàn)X的次數(shù)不僅受更高位影響,還受低位影響,等于更高位數(shù)字(2)X103-1+(93+1)=294)。最后是千位。現(xiàn)在已經(jīng)沒(méi)有更高位,因此直接看最大的千位數(shù)字 2 < X,所以不會(huì)包含任何 5。(也可以這么看,2<X,則千位上可能出現(xiàn)的X的次數(shù)僅由更高位決定,等于更高位數(shù)字(0)X104-1=0)。到此為止,已經(jīng)計(jì)算出全部數(shù)字 5 的出現(xiàn)次數(shù)。總結(jié)一下以上的算法,可以看到,當(dāng)計(jì)算右數(shù)第 i 位包含的 X 的個(gè)數(shù)時(shí):取第 i 位左邊(高位)的數(shù)字,乘以 10 i?1 ,得到基礎(chǔ)值 a 。 取第 i 位數(shù)字,計(jì)算修正值: 如果大于 X,則結(jié)果為 a+ 10 i?1 。 如果小于 X,則結(jié)果為 a 。 如果等 X,則取第 i 位右邊(低位)數(shù)字,設(shè)為 b ,最后結(jié)果為 a+b+1 。 相應(yīng)的代碼非常簡(jiǎn)單,效率也非常高,時(shí)間復(fù)雜度只有 O( log 10 n) 。?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
- 上一篇: 如何梳理产品功能,才能既见森林又见树木?
- 下一篇: STM32开发 -- Gerrit的详细