找“1”的个数

一、题目:

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

二.设计思想。

分别算出每一位上1出现的次数,再加起来就是总的次数。

三、源程序

#include<iostream.h>
#include<math.h>
int main()
{
    int num,a[10],n,k,s=0,b,c;
    //double b,c;
    cout<<"请输入输入数字的位数:"<<endl;
    cin>>n;
    cout<<"请输入数字:"<<endl;
    cin>>num;
    cout<<endl;
    k=num;
    for(int i=0;i<n;i++)
    {
        a[i]=num%10;
        num=num/10;
    }
    for(i=0;i<n;i++)
    {
        if(a[i]>1)
        {
            b=pow(10,(i+1));
            c=pow(10,i);
            s=s+(k/b+1)*c;
            //cout<<a[i]<<" "<<s<<endl;
        }
        else if(a[i]==1)
        {
            b=pow(10,(i+1));
            c=pow(10,i);
            s=s+k/b*c+k%c+1;
            //cout<<a[i]<<" "<<k/b*c<<" "<<k%c<<" "<<s<<endl;
        }
        else
        {
            b=pow(10,(i+1));
            c=pow(10,i);
            s=s+k/b*c;
            //cout<<a[i]<<" "<<s<<endl;
        }
    }
    cout<<"从0到"<<k<<"中1的个数为:"<<endl;
    cout<<s<<endl;
    return 0;
}

三、结果截图

五、实验总结

这次试验最重要的就是学会了找规律,先找出规律,再总结,写代码的时候就胸有成竹了。还有就是要进行分类讨论,比较,得出一个普遍适用规律。

时间: 2024-11-05 17:17:42

找“1”的个数的相关文章

Java-寻找矩阵连通域个数

给定一个矩阵,寻找连通域个数:前后左右相同为连通 ex: 0 1 0 1 0 1 1 1 0 0 1 0 0 1 0 0 输出2 利用深度搜索思路: 1 public static int getCount(int[][] A) { 2 int result = 0; 3 for (int i = 0; i < A.length; i++) { 4 for (int j = 0; j < A[0].length; j++) { 5 if (A[i][j] == 1) { 6 result++;

[面试题]在数组中找出3个数使得它们和为0

给定一个数组S,试找出3个数a, b, c,使得a+b+c=0.也即从集合中找出所有的和为0的3个数. 例如:集合S={-1,0, 1, 2, -1, 4},则满足条件的3个数有2对:(-1, 0, 1)和(-1, 2, -1).注意(-1,1,0)与(-1,0,1)算同一个解,所以不用重复考虑. 当然该例子集合的解也可以写成:(0, 1, -1)和(2, -1, -1). 参考了:http://blog.csdn.net/wangran51/article/details/8858398,他给

有两个变量a和b,不用“if”、“? :”、“switch”或其他判断语句,找出两个数中比较大的

1.问题 There are two int variables: a and b, don't use "if"."? :"."switch" or other judgement statement, find out the biggest one of the two numbers. (有两个变量a和b,不用"if"."? :"."switch"或其他判断语句,找出两个数中比较

【c语言】给一组数,只有一个数只出现了一次,其他所有数都是成对出现的。找出这个数

// 给一组数,只有一个数只出现了一次,其他所有数都是成对出现的.找出这个数 #include <stdio.h> int find_one(int arr[], int len) { int i = 0; int ret = 0; for (; i < len; ++i) { ret ^= arr[i]; } return ret; } int main() { int arr[] = { 1, 2, 3, 4, 1, 2, 3 }; printf("%d\n",

leetcode 1: 找出两个数相加等于给定数 two sum

问题描述 对于一个给定的数组,找出2个数,它们满足2个数的和等于一个特定的数,返回这两个数的索引.(从1开始) Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target,

【转】已知一个数出现的次数严格超过了一半,请用O(n)的复杂度的算法找出这个数

原文转自:http://blog.csdn.net/zhq651/article/details/7930284 方法1:既然过半,那么用这个数与其他数配对的话,剩余的数字一定还是过半的这个数字.因此可以通过不断删除不同的2个数,直到没有不同的2个数,那么这个数就是要找的数.证明:最坏情况下,只有这个数同别的数配对,并且被删除,剩下的仍旧是这个数,因此得证. 转自:http://www.cnblogs.com/python27/archive/2011/12/15/2289534.html 例:

LeetCode 18 4sum 找出4个数,使得他们的和等于target

题目: Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target. Note: Elements in a quadruplet (a,b,c,d) must be in non-descending or

课堂练习之找“1”的个数

一.题目 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数出其中1的个数. 二.要求 1.写一个函数F(N),返回1~N之间出现“1”的个数,例如:F(12)=5; 2.在32位整数范围内,满足条件的“F(N)=n”的最大的N是多少; 三.思路 情况1:如果百位上的数字为0,则可以知道百位上可能出现1的次数由更高位决定,比如12 013,则可以知 道百位出现1的情况可能是100-199,1 100-1 199,……,11 100-11 199,一共有1 200个.也就是 由更高位数字

Task 10 找1的个数

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