整数找一

一 问题说明

给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
要求:
写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数。例如 f(12)  = 5。
在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。

二 设计思路

      通过分析,发现可以将这个数中每位数分开讨论,比如327,1-327先讨论个位上出现1的个数,然后十位,最后是百位,最后将它们相加,最后可以得到最终结果。每一位上出现1的个数都是与相邻位上的数息息相关的。

三 代码实现

#include<iostream>
#include<math.h>
using namespace std;

void find(int n)
{
	int m=n,a,b,c,s=0,p=0;
	double k=0;
	while(m/10!=0)
	{
		a=m/10;
		b=m%10;
		if(k==0)
		{
			if(b==0) s=s+a;
			else s=s+a+1;
		}
		else
		{
			if(b==1)
			{
				s=s+(n/pow(10,k+1))*10+n%(int)pow(10,k);
			}
			else if(b==0)
			{
				s=s+n/pow(10,k);
			}
			else
			{
				p=n/pow(10,k+1);
				s=s+(p+1)*10;
			}
		}
		m=m/10;
		k++;
	}
	if(m==1)
	{
		c=n-m*pow(10,k);
		s=s+c+1;
	}
	else
	{
		c=pow(10,k);
		s=s+c;
	}
	cout<< s;
}

void main()
{
	int i;
    cout<<"请输入一个数:";
    cin>>i;
    find(i);
}

四 截图

五 总结

        这个问题困扰了很久,毫无头绪。最后还是得需要思考,一步一步找规律才能将问题解决,所以要将问题分析透彻,就需要一步步地找规律,然后才可以总结出一套完整的解决方案。

原文地址:https://www.cnblogs.com/houtaoliang/p/4549373.html