《找出1到正整数N中出现1的次数》
《找出1到正整数N中出现1的次数》
编程思想:依次求出正整数每个位数上出现1的次数,累加即可得到最后想要的结果;而每一位上出现1的个数与和它相邻的其它位数上的数字有关系(以此位置上的数为对称轴,其左边的所有数字作为其最高位,其右边的数字作为其最低位;当然若此位置已处于最低位或最高位,那么它对应的最低位或最高位置0),与它们有一个可求出1的固定的关系式(一个数各个位置上的数分离后,它们都对应着各个位置的基准,例如个位上的数对应的基准为1,以此类推即可),即若此位置上的数字为0,则在此位置上出现1的个数为最高位乘以基准;若为1,则等于最高位乘以基准加最低位再加1;若为其他,则为最高位加1乘以基准即可。即后,各个位上出现1的个数累加即可。
具体设计:(1)以4个变量high,m,low,f分别作为分离后当前位数的最高,本身,最低位以及分离其的基准;以while语句判断能进行进程的条件,只有当此数不越级别,才能继续进行,即在其中设置了一个判断终止的条件;
(2)依次按照个位,十位.......等等的顺序把各个位置上的数字分离出来,并以其为对称轴找出其最高位以及最低位:low=n-(n/f)*f;m=(n/f)%10;high=n/(f*10);
(3)用switch语句根据此位置上的数与最低,最高位上的数的固定关系式,依次累加计算每位上出现1的次数:switch(m){ case 0:count+=high*f; break; case1: count+=high*f+low+1;break;default:count+=(high+1)*f; break; }
(4)依次按照各位的基准把各位相应的出现的1的次数累加起来直至遇到终止的条件即可得到最终想要的结果。
源代码:
//找出1到正整数N中出现1的次数 //June 2th,2015 #include<iostream> using namespace std; long int f( long int n) { long int low=0,high=0,m=0,f=1,count=0; while(n/f!=0) { low=n-(n/f)*f; m=(n/f)%10; high=n/(f*10); switch(m) { case 0: count+=high*f; break; case 1: count+=high*f+low+1; break; default: count+=(high+1)*f; break; } f*=10; } return count; } void main() { int a,i=0; cout<<"请输入一个正整数:"<<endl; cin>>a; cout<<"f"<<"("<<a<<")"<<"="<<f(a)<<endl; long int m; cout<<"在32位整数中能找到符合要求的f(n)=n的最大数是:"<<endl; for(m=2147483647;m>=1&&i<1;m--) { if(f(m)==m) { cout<<m<<endl; i++; } } }
实验结果截图:
编程总结:(1)当老师给出问题的时候,只是单纯混沌的举了一些不相干的例子,并没有从其中总结出什么规律;
(2)听了同学们的各抒己见,大多数还是不能满足老师想要的结果,继续思索中.......
(3)课下在查阅了相关资料以及汲取了老师上课的提示后,明了了如何解决问题以及编写代码了;
总之,多交流,多思考,多汲取别人的优点,多开拓视野是解决问题的必经之路!