[0,N]範圍內0到9的分佈統計
阿新 • • 發佈:2019-02-10
end./********************************************************************************** *數字分佈問題 *計算[0,N]範圍內,特定數字的個數。譬如計算[0,12]範圍內1 的個數,即:f(12)= 5 *演算法1(暴力迴圈):從1-N,累加每一個數字中的1的個數 O(N*logN) *演算法2(尋找規律,得到公式):任一位置上1的個數都由:當前位(cur),高位(high),低位(low)3個位置決定 * count+=high*i; //與高位的關係,每次都直接疊加 * 1.cur<1 count+=0; //與當前位置的關係 * 2.cur=1 count+=low+1; //當前位是1的時候,跟低位也有關係 * 3.cur>1 count+=i; *推廣 計算[0,N]範圍內的0-9的分佈,#define DIGIT 1(修改DIGIT的值即可) *anthor: fangchang *time: 2016/04/04 12:14 ************************************************************************************/ #include<stdio.h> #define DIGIT 2 int numOfSpecialDigit(int i); void answer(); //暴力法 void answer2(); //公式法 int main() { int x=1; while(x!=0) { printf("input x(x=0:game over):\n"); scanf("%d",&x); printf("this is answer():\n"); answer(); printf("this is answer2():\n"); answer2(); } fflush(stdin); getchar(); return 0; } void answer() { int i ; int n; int count=0; printf("please input a digit for n(n>=0):\n"); scanf("%d",&n); for(i=0;i<=n;++i) { count+=numOfSpecialDigit(i); } printf("[0,%d] has %d %d\n",n,count,DIGIT); } int numOfSpecialDigit(int i){ //每一個數字中的特定數字個數 int count=0; int tmp; while(i) { tmp=i%10; count += tmp==DIGIT ? 1:0; i=i/10; } return count; } void answer2() { int cur_digit; int high_digit; int low_digit; int n; int i=1; //從個位開始 int count=0; printf("please input a digit for n(n>=0):\n"); scanf("%d",&n); while(0!=(n/i)) { cur_digit = (n/i)%10; //得到當前位 high_digit = n/(i*10); //得到高位 low_digit = n - (n/i)*i; //得到低位 count+=high_digit*i; if(cur_digit<DIGIT) { //小於,則該位沒有特定數字 count += 0; } else if(cur_digit == DIGIT) { //等於時,個數由低位決定 count+=low_digit+1; } else if(cur_digit>DIGIT) { //大於,則直接加該位的權值即可(百位就加100) count += i; } i*=10; //權值。個位結束,則計算十位,依次進行 } printf("[0,%d] has %d %d\n",n,count,DIGIT); }