自然数从1到n之间,有多少个数字含有1

    问题明确而简单.for循环肯定是不好的.

      用递推方法:

      定义h(n)=从1到9999.....9999  ( n 个 9)之间含有1的数字的个数.定义f(n)为n位数中含有1的数字的个数.

   由定义可知:h(n)=f(1)+f(2)+f(3)+....+f(n);

则f(1)=h(1)=1;

  f(2)=10^1+8*h(1).

  f(3)=10^2+8*h(2).

  f(4)=10^3+8*h(3).

  ......

  意义如下:f(4)是一个四位数,假如最高位(千位)为1,那么后面是啥都行,这个数字必然有1了,所以是10^3.

    假如最高位不是1,最高位不能是0(不然就成3位数了),所以最高位有8种选择2,3,4,5,6,7,8,9.这样一来,低三位中必须含有1,要不然就没有一了.所以乘上h(3).

    

    下面举一个例子,求1到2345之间含有1数字的个数.

    2345=h(1)+h(2)+h(3)+h(4)的一部分.

    关键是h(4)的一部分应该怎么求.定义p(4,2)表示是四位数并且虽高位小于2的数中含有1的个数.p(4,2)=10^3+p(3,3);看到这里就应该明白了.p(3,3)表示三位数中最高位小于3的含1数字的个数.

时间: 2024-10-13 12:29:10

自然数从1到n之间,有多少个数字含有1的相关文章

一个自然数在1700和1800之间,且被5除余3,被7除余4,被11除余6,求符合条件的数

昨天晚上看了一道逻辑题:一个自然数在1700和1800之间,且被5除余3,被7除余4,被11除余6,求符合条件的数.题目后面写着,有人看了几分钟便给出了答案.我很好奇,此人是如何解答的. 我自己先琢磨了下,拿笔算了半天,最后一个巧合的情况下,得到了答案.此题的一个关键且明显的推论是:能被5除余3的数,肯定最后一位是3或者8.那么接下来怎么推呢?我从网上搜集了答案. 方案1: 这个数被5除余3,则此数个位数为3或8, 设这个数十位为x,则此数可表达为1703+10x,或1708+10x当此数为17

判断101-200之间有多少个素数,并输出所有素数(C)

/* *题目:判断101-200之间有多少个素数,并输出所有素数. * *程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果 *能被整除,则表明此数不是素数,反之是素数. */ #include<stdio.h> #include<math.h> int main() { int k,i,j,m,sum=0; int flag; for(i=101;i<=200;i++){ flag=1; k=sqrt(i); for(j=2;j<=k;j++){

判断101-200之间有多少个素数,并输出所有素数。

package com.mumu.ready;import static com.mumu.ready.Print.print; public class Prime {//题目:判断101-200之间有多少个素数,并输出所有素数. public static boolean prime(int n) { boolean flag=false; for(int i=2;i<=n/2;i++) { if(n%i==0) { flag=true; continue; } } return flag;

代码实现:判断101-200之间有多少个素数(质数),并输出所有素数。 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。

package com.heima.Coding; /* 判断101-200之间有多少个素数(质数),并输出所有素数. 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数.*/ public class Test { public static void main(String[] args) { int count = 0; for (int i = 100; i < 200; i++) { for (int j = 2; j <=

作业1:求500到1000之间有多少个素数,并打印出来

首先要知道什么是素数:所谓素数是指除了1和它本身以外,不能被任何整数整除的数. 数学里判断一个数n是否是素数,用n除以从2到这个数开方后所能取得最大整数,如果都不能整除,就说明这个数是素数. 所以这里我们用两层循环遍历 1 package com.etc; 2 public class IsSushu { 3 /** 4 * 第一题作业:求500到1000之间有多少个素数,并打印出来 5 * @param args 6 */ 7 public static void main(String[]

Java 实现1~100之间有多少个素数并输出所有素数

/* 2.判断1-100之间有多少个素数并输出所有素数. (将判断一个数是否是素数的功能提取成方法,在循环中直接调用即可) */ public class primeNumber{ public static void main(String[]args) { int count = 0; //产生1~100之间用for循环 for(int i=1;i<=100;i++) { if(isPrime(i)){ System.out.println(i); count++; } } System.o

Java基础知识强化04:判断101~200之间有多少素数

判断101~200之间有多少素数? 1 package himi.hebao; 2 3 /** 4 * (1).编写函数isPrime()用来判断输入数据是否为素数 (2).遍历判断101~200之间的数据是否为素数,并且计数count 5 * 6 * @author Administrator 7 * 8 */ 9 10 public class TestDemo05 { 11 12 public static void main(String[] args) { 13 int count =

统计起始日期之间有多少个2月29日

题目:统计起始日期之间有多少个2月29. #include <iostream> #include <string> using namespace std; class Date { private: int month; int day; int year; static int getMonthFromString(const string &s) { static const string months_str[12] = { "January"

判断101-200之间有多少个素数,并输出所有素数

题目:判断101-200之间有多少个素数,并输出所有素数. 程序分析:判断素数的方法:用一个数分别去除2得到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数. 1 package com.li.FiftyAlgorthm; 2 3 /** 4 * 题目:判断101-200之间有多少个素数,并输出所有素数. 5 * 6 * 程序分析:判断素数的方法:用一个数分别去除2得到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数. 7 * 8 * @author yejin