`
phyeas
  • 浏览: 165228 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

求1到2008080808之间含有数字7的个数总和? 其实没那么复杂

阅读更多
在CSDN上看到的题..看到很多人的算法都挺复杂的..

从小的数字看起..10里有1个100是10的10倍.但是100里还有70-79都是..所以就是 1*9+10=19个
那么1000就是  (1*9+10)*9+100
10000就是  ((1*9+10)*9+100)*9+1000嗯.是麻烦.所以要把公式提炼出来把这个算术式分析一下。就可以得到公式
这个东西算出来就是9*9*9+810+900+1000=9的三次方*10的0次方+9的2次方*10的一次方 + 9的1次方*10的2次方+9的0次方*10的3次方
                                                                  (9*9*9)              (810)                                (900)                           (1000)

如果把  求1到2008080808之间含有数字7的个数总和?  简化为 求 10000以内的含有数字7的数的应该这样9的3次方*10的0次方 + 9的2次方*10的1次方 + 9的1次方*10的2次方  +  9的0次方+10的3次方
其实就是要求N位数的含有某数字的个数先求出N为数的最小数a然后计算a以内有多少个acount=9的n-2次方*10的0次方 + .... + 9的0次方*10的n-2次方.
然后用该整数除以a得到该整数是a的b倍..再用b*acount.得出该整数减去该整数除以a的余数包含的所有包含该数字的数的数量依次类推..

这个可以一直做下去。 2008080808 = 2000000000  先求出 2000000000 包含的个数  8000000  再求8000000内包含的个数      800   ...        8  ...

(改天附上程序实现)


一下是程序实现:
package org.phyeas.demo;

public class Main {
    
public static void main(String[] args) {
        System.out.println(lookUpForHasNumber(
2008080808 , 7));
    }


    
/** *//**
     * 查找从从1到end含有数字hasNumber的个数
     * 
     * 
@param end
     *            结束
     * 
@param hasNumber
     *            含有某数字
     * 
@return
     
*/

    
public static int lookUpForHasNumber(long end, int hasNumber) {
        
int count = 0;
        
long less = getLess(end);
        
while (less > 10{
            
int n = (int) Math.log10(less);
            
long bei = end / less;
            
int tempCount = 0;
            
for (int i = n - 1, j = 0; i >= 0; i--, j++{
                tempCount 
+= Math.pow(9, i) * Math.pow(10, j);
            }

            
if (bei >= 1{
                
if (bei > hasNumber) {
                    tempCount 
= (int) ((int) (tempCount * (bei - 1)) + less);
                }
 else if (bei == hasNumber) {
                    tempCount 
= (int) (tempCount * bei) + 1;
                }
 else {
                    tempCount 
= (int) (tempCount * bei);
                }

            }

            count 
+= tempCount;
            
            end 
= end - less * bei;
            less 
= getLess(end);
        }

        
if (less > hasNumber) {
            count 
= count + 1;
        }

//        System.out.println("count=" + count);
        return count;
    }


    
/** *//**
     * 获取与这个数字位数相同的最小数
     * 
     * 
@param number
     * 
@return
     
*/

    
public static long getLess(long number) {
        
if (number > 10{
            String str 
= String.valueOf(number);
            StringBuffer nStr 
= new StringBuffer("1");
            
for (int i = 1; i < str.length(); i++{
                nStr.append(
"0");
            }

            
return Long.parseLong(nStr.toString());
        }

        
return number;
    }

}

最后结果:1229473242
分享到:
评论

相关推荐

    枚举的实现求得1-1000所有出现1的数字并计算出现1的个数

    接下来,我们使用`console.log(tmp.length)`打印出数组`tmp`的长度,即1到1000之间含有1的数字的个数。然后,使用`tmp.reduce()`方法计算这些数字中1的总数。`reduce()`函数接受一个回调函数,它有两个参数`i`和`j`...

    FineReport函数

    与SUM函数不同的是,AVERAGE函数忽略文本、逻辑值和空白单元格,只计算数字或含有数字的单元格。如果引用的单元格中包含零值,它们会被计算在内。 CHAR函数可以将数字代码转换为对应的字符。它接受的参数是一个介于...

    优秀资料(2021-2022年收藏)小学数学四年级上册培优补差记录表已排版可打印.doc

    4. **长方形和正方形**:培优和补差训练都涉及到求周长和面积的问题,这要求学生理解周长是所有边长的总和,面积是图形占据的平面空间大小。对于正方形,周长是4倍边长,面积是边长的平方;对于长方形,周长是两倍长...

    Excel问题集合

    #### 八、用COUNTIF计算整个B列中含有“F”这个字符的单元格的个数 公式如下: ```excel =COUNTIF(B:B, "*F*") ``` #### 九、自动记录出车情况 1. **创建记录表**:在Excel中设置记录表,包括时间、地点、出车人...

    福建省南安市石井镇厚德中学九年级化学上册 第3章 物质构成的奥秘(第2课时)复习导学案(无答案)(新版)沪教版

    - 含有元素种类最多的纯净物通常是复杂的有机化合物,肉毒碱(C7H15NO3)就是一个例子。 10. **化学符号中的数字2**: - 元素符号前的数字表示原子的个数,如2H表示两个氢原子。 以上就是根据标题和描述中涉及的...

    01-循环结构程序设计课后练习及题解.docx

    一种简洁的方法是,先将所有数字加起来得到一个总和,然后减去所有偶数的和(因为它们都被计算为负数)。这样,我们得到的最终结果就是原序列的和。 第二个问题要求统计输入字符串中的字母、空格、数字和其他字符。...

    LINGO软件的学习

    因此,派生集的索引个数是最终原始父集的个数,索引的取值是从原始父集到当前派生集所作限制的总和。 总的来说,LINGO可识别的集只有两种类型:原始集和派生集。 在一个模型中,原始集是基本的对象,不能再被拆分成...

    2021-2022年收藏的精品资料专题4.2 化学式和化合价第03期中考化学试题分项版解析汇编原卷版.doc

    1. **化学式的意义**:化学式是用来表示纯净物组成的一类符号,如题目中的 C15H22O5 是青蒿素的化学式,它表明青蒿素由碳、氢、氧三种元素组成,且碳、氢、氧原子的个数比例为15:22:5。 2. **分子结构**:题目提到...

    c++ 面试题 总结

    各种内存管理都有它自己的方法来计算出程序片断在主存中的物理地址,其实都很相似。 这只是一个大概而已,不足以说明内存管理的皮毛。无论哪一本操作系统书上都有详细的讲解 -----------------------------------...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    日期类型 date 7字节 用于存储表中的日期和时间数据,取值范围是公元前4712年1月1日至公元9999年12月31日,7个字节分别表示世纪、年、月、日、时、分和秒 二进制数据类型 row 1~2000字节 可变长二进制数据,在具体...

Global site tag (gtag.js) - Google Analytics