zoukankan      html  css  js  c++  java
  • 整数找一

    一 问题说明

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

    二 设计思路

          通过分析,发现可以将这个数中每位数分开讨论,比如327,1-327先讨论个位上出现1的个数,然后十位,最后是百位,最后将它们相加,最后可以得到最终结果。每一位上出现1的个数都是与相邻位上的数息息相关的。

    三 代码实现

    #include<iostream>
    #include<math.h>
    using namespace std;
    
    void find(int n)
    {
    	int m=n,a,b,c,s=0,p=0;
    	double k=0;
    	while(m/10!=0)
    	{
    		a=m/10;
    		b=m%10;
    		if(k==0)
    		{
    			if(b==0) s=s+a;
    			else s=s+a+1;
    		}
    		else
    		{
    			if(b==1)
    			{
    				s=s+(n/pow(10,k+1))*10+n%(int)pow(10,k);
    			}
    			else if(b==0)
    			{
    				s=s+n/pow(10,k);
    			}
    			else
    			{
    				p=n/pow(10,k+1);
    				s=s+(p+1)*10;
    			}
    		}
    		m=m/10;
    		k++;
    	}
    	if(m==1)
    	{
    		c=n-m*pow(10,k);
    		s=s+c+1;
    	}
    	else
    	{
    		c=pow(10,k);
    		s=s+c;
    	}
    	cout<< s;
    }
    
    void main()
    {
    	int i;
        cout<<"请输入一个数:";
        cin>>i;
        find(i);
    }
    

    四 截图

    五 总结

            这个问题困扰了很久,毫无头绪。最后还是得需要思考,一步一步找规律才能将问题解决,所以要将问题分析透彻,就需要一步步地找规律,然后才可以总结出一套完整的解决方案。

  • 相关阅读:
    LeetCode Path Sum II
    LeetCode Longest Palindromic Substring
    LeetCode Populating Next Right Pointers in Each Node II
    LeetCode Best Time to Buy and Sell Stock III
    LeetCode Binary Tree Maximum Path Sum
    LeetCode Find Peak Element
    LeetCode Maximum Product Subarray
    LeetCode Intersection of Two Linked Lists
    一天一个设计模式(1)——工厂模式
    PHP迭代器 Iterator
  • 原文地址:https://www.cnblogs.com/houtaoliang/p/4549373.html
Copyright © 2011-2022 走看看