1. 程式人生 > >從1到n整數中1出現的次數

從1到n整數中1出現的次數

strings pac num 輸入12 出現的次數 n-1 include () 輸入

題目

輸入一個整數n,求從1到n這n個整數的十進制表示中1出現的次數。例如輸入12,從1到12這些整數中包含1的數字有1,10,11和12,1一共出現了5次。

思路

  1.先根據數組的最高位計算1出現的次數

  • 如果只有一位數且該為是0,返回0
  • 如果只有一位數且該為大於0,則1出現的次數只有1次
  • 如果最高位數字大於1,則最高位1出現的次數是10^len-1次方
  • 如果最高位數字不大於1,1出現的次數是除最高位所有的數字+1次

  2.其他位1出現的次數:最高位不變,固定其他一位,剩余的位數全排列

  3.去除最高位,遞歸求得依次剩余的位數

#include <iostream>
#include 
<sstream> #include <cmath> using namespace std; class Solution { public: int num_of_one(string s); int digit(const unsigned int n); }; int Solution::num_of_one(string s) { if(s.empty()||s.size()<=0||*s.begin()<=0||*(--s.end())>9) return 0;
//1.先根據數組的最高位計算1出現的次數 int first=*s.begin()-0; unsigned int len=s.size(); if(len==1&&first==0) //如果只有一位數且該為是0,返回0 return 0; else if(len==1&&first>0)//如果只有一位數且該為大於0,則1出現的次數只有1次 return 1; int num_first_digit=0; if(first>1)//如果最高位數字大於1,則最高位1出現的次數是10^len-1次方
num_first_digit=digit(len-1); else if(first==1)//如果最高位數字不大於1,1出現的次數是除最高位所有的數字+1次 num_first_digit=*(++s.begin())-0+1; //2.其他位1出現的次數:最高位不變,固定其他一位,剩余的位數全排列 int num_other_digit=first*(len-1)*digit(len-2); s.erase(s.begin()); //3.去除最高位,遞歸求得依次剩余的位數 int num_recursive=num_of_one(s); return num_first_digit+num_other_digit+num_recursive; } int Solution::digit(const unsigned int n) { return (int)pow(10,n); } int main() { long n; cin>>n; stringstream ss; ss<<n; Solution s; cout<<s.num_of_one(ss.str())<<endl; return 0; }

從1到n整數中1出現的次數