PAT A 1049. Counting Ones (30)

题目

The task is simple: given any positive integer N, you are supposed to count the total number of 1's in the decimal form of the integers from 1 to N.  For example, given N being 12, there are five 1's in 1, 10, 11, and 12.

Input Specification:

Each input file contains one test case which gives the positive N (<=230).

Output Specification:

For each test case, print the number of 1's in one line.

Sample Input:

12

Sample Output:

5

 

统计 1~n的所有数中1的数量。

0时,1的个数为0;到9时,1的个数为1;到99时,1的个数为20……

data[i]i9时的1的个数data[i]=data[i-1]*10+10^(i-1)

 

到数字n时的1的总个数递推关系为:

1、先加上最高位i导致的后面出现的(9999i-19)的次数的引入的1

2、再考虑由最高位引入的1

3、然后删除最高位,循环

 

代码:

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
	int n,num=0;	//输入的数,1的个数
	cin>>n;
	int data[12];	//到第i位(9,99,999…对应1,2,3…)时1的数量(其实就是1,20,300…)
	int number[12];	//第i位的数字(从1开始计数)
	int i,j,temp=n;

	data[0]=0;	//0编号用来保证数据安全
	number[0]=0;
	for(i=1;i<12;i++)	//获取data[],number[]
	{
		number[i]=temp%10;
		temp/=10;
		if(temp==0)	//直到最高位
			break;
		data[i]=data[i-1]*10+pow(double(10),i-1);
	}
	
	for(;i>0;i--)
	{
		num+=number[i]*data[i-1];	//加上最高位(i)*0到99…99(i个9)时1的个数
		if(number[i]>1)	//最高位大于1,再加10^(i-1)
			num+=(int)pow((double)10,i-1);
		else if(number[i]==1)	//最高位为1,再加n(已经减去前面的高位)-10^(i-1)+1
			num+=n-(int)pow((double)10,i-1)+1;
		n-=number[i]*(int)pow((double)10,i-1);	//去掉最高位
	}

	cout<<num;

	return 0;
}


 

 

 

 

 

你可能感兴趣的:(C++,pat)