• “找一”


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

    思路:我是根据老师课上提出的思路,

    在从X0--X9(x是任意小于等于9的数字)之内只有一个1

    在任意X00--X99之内也只有一段x1y(x,y均为常数)

    以此类推

    比如求23以内的1的个数,23包含0--9,10--19,20--23这三段,每一段各位都含有一个一(共三个),而10--19十位也是1所以这一段就包含10个1,所以一共13个一。

    比如求100以内的1的个数,100包含0--9,10--19,20--29......90--99这十段,每一段各位都含有一个一共是个1(共十个),而10--19十位也是1所以这一段就包含10个1(共十个),但是要注意的是100也含有一个1,所以一共21个一。

    具体代码实现如下:(编译环境:vs2008,语言c++)

    #include <iostream>
    #include <cmath>
    using namespace std;
    #define N 5
    
    int findone(int i){
    	int a[N];
    	int p = 0,j,num = i; ;
    	int sum = 0;
    	while(i){
    		if(p < N){
    			a[p] = i%10;
    			i = i/10;
    		}
    		p++;
    	}
    	if(a[p-1]!=1){
    		for(j = 0;j < p;j++){
    			if(a[j] >= 1)
    				sum += int((num/pow(10,double(j+1))+1))*int(pow(10,double(j))) ;
    			else
    				sum += int((num/pow(10,double(j+1))))*int(pow(10,double(j))) ;
    		}
    	}
    	if(a[p-1]==1){
    		int figure = num;
    		for(j = 0;j < p-1;j++){
    			if(a[j] >= 1)
    				sum += int((num/pow(10,double(j+1))+1))*int(pow(10,double(j))) ;
    			else
    				sum += int((num/pow(10,double(j+1))))*int(pow(10,double(j))) ;
    			figure = int(a[j]*pow(10,double(j)));
    		}
    		sum = sum+figure+1;
    	}
    	return sum;
    }
    
    void main(){
       int i;
       cout<<"please input a number :"<<endl;
       cin>>i;
       cout<<"the amount of 1 is :     "<<findone(i)<<endl;
       system("pause");
       
    }
    

      

    总结,刚开始的时候老师提出要找规律觉得会很难实现,可是当自己认真做的时候发现其实并不是很难只要发现规律代码就很容易能实现

  • 相关阅读:
    as3 三行三列 布满9个为一个界面
    as3 判断鼠标移动方向
    求两点之间 的直线距离
    AS3 localToGlobal、globalToLocal方法的总结
    as3 TweenMax TweenLite方法
    禁止点击
    影片 发光 变色
    ASCII字符串互换
    关于C语言的书
    关于态度
  • 原文地址:https://www.cnblogs.com/laozhanghahaha/p/4553376.html
Copyright © 2020-2023  润新知