- #include <stdio.h>
- unsigned long func(int a, int n)//求组合c(a,n)
- {
- unsigned long result = 1, temp = 1;
- int i;
- for (i = n;i > n-a; i--)
- {
- result *= i;
- }
- for (;a > 0; a--)
- {
- temp *= a;
- }
- if (temp != 0)
- result /= temp;
- return result;
- }
- unsigned long fun(int a, int n)//求a^n
- {
- int result;
- if (n == 0)
- {
- result = 1;
- }
- else
- {
- result = a;
- }
- for (;n > 1;n--)
- {
- result *= a;
- }
- return result;
- }
- unsigned long _findm(unsigned long a)//a位数,包含m的情况有多少
- {
- unsigned long i, result = 0;
- for (i = 1; i <= a; i++)
- {//有i个m的情况
- result += (func(i, a)*fun(9, a-i));
- }
- return result;
- }
- unsigned long findm(unsigned long arg, unsigned long m)//0~arg之间有多少个含有m的整数
- {
- unsigned long n = 0, a = 1;//arg是n+1位数,第一位数字是a,其余位都是0
- unsigned long result;
- a = arg;
- while (a > 10)
- {
- a /= 10;
- n++;
- }
- result = _findm(n);
- if (a < m)
- {
- result *= a;
- }
- else
- {
- result *= (a-1);
- result += (arg/a);
- }
- return result;
- }
- unsigned long group(unsigned long n, unsigned long a)//将n分组,起点是a,返回终点
- {
- unsigned long result;
- int i = 0;
- n -= a;
- while (n > 10)
- {
- n /= 10;
- i++;
- }
- result = fun(10, i);
- result *= n;
- return result;
- }
- unsigned long calc(unsigned long n, unsigned long m)//计算从1到N之间的整数有多少个含有数字m
- {
- unsigned long a = 0, b, result = 0;
- do
- {
- b = group(n, a);
- result += findm(b, m);
- a += b;
- } while (b != 0);
- return result;
- }
- void main()
- {
- unsigned long result, n, m;
- // printf("Input N:");scanf("%d", &n);
- // printf("Input M:");scanf("%d", &m);
- n = 2008080808;
- m = 7;
- result = calc(n, m);
- if (m == 0)
- result--;
- printf("共有%d个整数含有7/n", result);
- }
现的从1到N的出现M的次数算法
最新推荐文章于 2023-08-28 16:44:37 发布