一、题目:
给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。要求: 1.写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数。例如 f(12) = 5。2.在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。
二、思路:
这道题偏向数学的推理,其根本在于找规律,而规律则在于将所给的数进行分解,分成个十百千等位数的个体,再从每个中寻找规律。通过整理,每一位有多少个1只与其前后两位有关系,具体算法程序如下:
三、源程序
1 #include<iostream.h> 2 #include<stdlib.h> 3 int main() 4 { 5 int num; 6 int count=0; 7 int flog=1; 8 int low=0; 9 int now=0; 10 int high=0; 11 cout<<"请输入数字: "; 12 cin>>num; 13 while (num/flog!=0) 14 { 15 low=num-(num/flog)*flog; 16 now=(num/flog)%10; 17 high=num/(flog*10); 18 switch (now) 19 { 20 case 0: 21 count=count+high*flog; 22 break; 23 case 1: 24 count=count+high*flog+low+1; 25 break; 26 default: 27 count=count+(high+1)*flog; 28 break; 29 } 30 flog=flog*10; 31 } 32 cout<<num<<"中出现数字1的个数为:"<<count<<endl; 33 return 0; 34 }
四:实验截图
五、实验总结
这节课所学最大的地方就是找规律。越来越感觉计算机其实就是机械化的数学。在寻找模型、组合算法的过程中其实就是列方程、解题的过程。通过对数学模型的整理、来实现程序的实现。
时间: 2024-11-05 20:38:42