标签:
一、实验题目
给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数出其中1的个数。 要求:
1、写一个函数F(N),返回1~N之间出现“1”的个数,例如:F(12)=5;
2、在32位整数范围内,满足条件的“F(N)=n”的最大的N是多少;
二、设计思路
规律:
每一位上都只有三种情况:0,1,2-9 第 i 位(个位算作第0位,十位算作第1位。。。。。):
0: Num/(10^(i+1))*(10^i)
1: Num/(10^(i+1))*(10^i)+Num%(10^i)+1;
2-9: (Num/(10^(i+1))+1)*(10^i)
代码:
#include<iostream.h>
#include<math.h>
int shu1(int num)
{
int flog=1;//标记计数1的位数(1为个位,10为十位)
int now=0;//当前位数
int low=0;//较低位数
int high=0;//较高位数
int count=0;
while(num/flog!=0)
{
now=(num/flog)%10;
low=num-(num/flog*flog);
high=num/(flog*10);
if(num<=0)
return 0;
if(0==now)//当前数字为0时计数
{
count+=high*flog;
}
else if(1==now)//当前数字为1时计数
{
count+=high*flog+low+1;
}
else
{
count+=(high+1)*flog;
}
flog=flog*10;//数字左移一位
}
return count;
}
void main()
{
int num;
int max=0;
cout<<"请输入要测试的数值:";
cin>>num;
cout<<"出现“1”的个数为:"<<shu1(num)<<endl;
}
截图:

实验总结: 结合老师课堂上的分析,编写代码的过程其实不是很复杂,主要是算法思想如何能够简单快捷的实现目标,准确找到1的个数,个位数上的1,十位数上的1,最后求和就可以编写出来基本代码。
标签:
原文地址:http://www.cnblogs.com/TSbj/p/4585859.html