令Xi为数字A在第i位上的数字,y为x在A的第i位出现的次数,有以下规律:
当x<Xi时, y等于第i位左边一位的数字加1再乘以10的i-1次方;
当x=Xi时,y等于第i位左边一位的数字乘以10的i-1次方再加上A对10的(i-1)次方求余数再加1;
当x>Xi时,最简单,y等于第i位左边一位的数字乘以10的i-1次方.
程序实现,用的是1,需要注意的是pow的返回值是double,需要再前面加上(int)使其转换为int类型的值.
#include<math.h> #include<iostream> using namespace std; int NumberOf1Between1AndN_Solution(int n) { int total = 0; for (int i = 1; (int)pow(10, i - 1)<=n; i++) { int Xi = (n / (int)pow(10, i - 1)) % 10; cout << Xi << endl; if (1<Xi) total += (1 + n / (int)pow(10, i))*(int)pow(10, i - 1); else if (Xi == 1) total += (1 + n % (int)pow(10, i - 1) + n / (int)pow(10, i)*(int)pow(10, i - 1)); else total += n / (int)pow(10, i)*(int)pow(10, i - 1); } return total; } int main() { int x = NumberOf1Between1AndN_Solution(21651); cout << x; return 0; }