题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12共出现了5次。
不考虑时间效率的解法:
1 int NumberOf1Between1AndN(unsigned int n) 2 { 3 int number=0; 4 for(unsigned int i=1;i<=n;++i) 5 number +=NumberOf1(i); 6 return number; 7 } 8 int NumberOf1(unsigned int n) 9 { 10 int number=0; 11 while(n) 12 { 13 if(n%10==1) 14 number++; 15 n=n/10; 16 } 17 return number; 18 }
从数字规律着手明显提高时间效率:
1 int Numberof1Between1AndN(int n) 2 { 3 if(n<=0) 4 return 0; 5 char strN[50]; 6 sprintf(strN,"%d",n);//将整数转换为字符串 7 return NumberOf1(strN); 8 } 9 10 int NumberOf1(const char* strN) 11 { 12 if(!strN||*strN<'0'||*strN>'9'||*strN=='