1的数目

题目:写一个函数f(N),返回1到N之间出现的"1"的个数。

(1)循环遍历1-N,分别求每个数字的中包含1的个数。

 

#include <iostream>
using namespace std;

int Count(long num)
{
	int temp=0;
	while (num)
	{
		temp+=num % 10 == 1 ? 1 : 0;
		num/=10;
	}
	return temp;
}

int main()
{
	long num=100000000;
	long i;
	int total=0;
	for (i=1; i<=num; ++i)
	{
		total+=Count(i);
	}
	cout<<"total="<<total<<endl;
}

 (2)假设N=A*10^i + B*10^(i-1) + C,即A,B和C分别代表第i位的高位数值,当前位数值和低位数值。第i位上1的个数与A,B,C可能都有关。
    当B > 1时,([0-A],1,*)<(A,B,C),一共是(A+1)*10^i个1,高位相关。
    当B = 1时,([0-(A-1),1,*])<(A,B,C),[A,1,[0-C]] <= (A,B,C),一共是A*10^i+C+1个1,高位低位相关。
    当B = 0时,([0-(A-1)],1,*)<(A,B,C),一共是A*10^i个1,高位相关。

#include <iostream>
using namespace std;
int find_num(int N, int x)
{  
	int count = 0; 
	int A,B,C,factor; 
	factor = 1;  
	while(N >= factor) 
	{    
		A = N / (factor * 10);   
		B = N / factor % 10;    
		C = N % factor;     
		cout << "(A,B,C): " << "(" << A << "," << B << "," << C << ")" << endl;    
		if(B > x)      
			count += (A+1) * factor;
		else if(B == x)      
			count += A * factor + C + 1;     
		else 
			count += A * factor;
		factor *= 10; 
			 
	}  
	return count;
}

int main() 
{  
	int N; 
	while(true) 
	{    
		cout << "输入N:";    
		cin >> N;   
		int count = find_num(N, 1);  
		cout << 1 << "到" << N << "中1的个数:";  
		cout << count << endl;   
		cout << endl;   
	}  
	return 0;
}

 

 

posted @ 2012-05-09 16:23  徐露  阅读(225)  评论(0编辑  收藏  举报