zoukankan      html  css  js  c++  java
  • “找一”

    给定一个十进制的正整数,写下从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");
       
    }
    

      

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

  • 相关阅读:
    THINKphp学习笔记
    Js获取当前日期时间及其它操作
    Oracle数据导入导出imp/eXP
    SQL中的单记录函数
    Windows服务C#/VS2003
    oracle数据库开发的一些经验积累
    Oracle 数据库的安全策略
    高兴
    无法正确运行的C#程序
    最详细的Visual C++ 2008 Express Edition使用方法(图文)
  • 原文地址:https://www.cnblogs.com/laozhanghahaha/p/4553376.html
Copyright © 2011-2022 走看看