整数找一
一 问题说明
给定一个十进制的正整数,写下从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);
}
四 截图

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