zoukankan      html  css  js  c++  java
  • PAT 1049. Counting Ones

    The task is simple: given any positive integer N, you are supposed to count the total number of 1's in the decimal form of the integers from 1 to N. For example, given N being 12, there are five 1's in 1, 10, 11, and 12.

    Input Specification:

    Each input file contains one test case which gives the positive N (<=230).

    Output Specification:

    For each test case, print the number of 1's in one line.

    Sample Input:
    12
    Sample Output:
    5

    分析
    这道题我的做法占用的空间大了

    /*空间超限了*/
    #include<iostream>
    #include<vector>
    using namespace std;
    int main(){
    	long long int n,sum=0;
    	cin>>n;
    	vector<int> a(n+1,0);
    	for(int i=1;i<=n;i++){
    		if(i%10==0)
    			a[i]=a[i/10];
    		else if(i%10==1)
    		    a[i]=a[i-1]+1;
    		else if(i%10==2)
    		    a[i]=a[i-1]-1;
    		else 
    		    a[i]=a[i-1];
    		sum+=a[i];
    	}
    	cout<<sum<<endl;
    	return 0;
    } 
    

    然后搜了一下网上别人的做法:

    题目大意:给出一个数字n,求1~n的所有数字里面出现1的个数
    分析:这是一道数学问题。从第一位(个位)到最高位,设now为当前位的数字,left为now左边的所有数字构成的数字,right是now右边的所有数字构成的数字。只需要一次次累加对于当前位now来说可能出现1的个数,然后把它们累加即可。a表示当前的个位为1,十位为10,百位为100类推。
    对于now,有三种情况:
    1.now == 0 : 那么 ans += left * a; //因为now==0说明now位只有在left从0~left-1的时候会产生1,所以会产生left次,但是又因为右边会重复从0~999…出现a次
    2.now == 1 : ans += left * a + right + 1;//now = 1的时候就要比上一步多加一个当now为1的时候右边出现0~right个数导致的now为1的次数
    3.now >= 2 : ans += (left + 1) * a;//now大于等于2就左边0~left的时候会在now位置产生1,所以会产生left次,但是又因为右边会重复从0~999…出现a次
    

    代码如下

    /*就是计算1在各个位置上出现的可能数相加*/
    #include<iostream>
    using namespace std;
    int main(){
    	int left,now,right,n,a=1,sum=0;
    	cin>>n;
    	while(n/a){
    		left=n/(a*10),right=n%a,now=n/a%10;
    		if(now==0) sum+=left*a;
    		else if(now==1) sum+=left*a+right+1;
    		else sum+=(left+1)*a;
    		a*=10;
    	}
    	cout<<sum<<endl;
    	return 0;
    }
    
  • 相关阅读:
    Unique Binary Search Trees 解答
    Unique Paths II 解答
    Unique Paths 解答
    Maximum Subarray 解答
    Climbing Stairs 解答
    House Robber II 解答
    House Robber 解答
    Valid Palindrome 解答
    Container With Most Water 解答
    Remove Duplicates from Sorted List II 解答
  • 原文地址:https://www.cnblogs.com/A-Little-Nut/p/8330664.html
Copyright © 2011-2022 走看看