数1-n个数中0-9出现过多少次

最初的问题是这样的:

题目:通过编程实现,统计1~n有多少个9

提示:n通过参数传入

思路出炉的时候可以顺便(或者必须)其他几个数出现的次数一并求了,所以就设计了这样的程序:

#include <stdio.h>


int main()
{
    int i,j,n;
int a[10] = {0};//  


printf("please input a number:");
scanf("%d",&n);

for(i = n;i > 0;i--)
{
j=i;
        while(j)
{
a[j%10]++;
j /= 10;
}
}






printf("%d\n",a[9]);
return 0;
}

通过申请了一个10元素的数组分别存放0-9出现的次数,再设计循环,从n开始每个记录出现的数字,并在相应数组元素处加1,以此输出。不过既然题目要求只输出9的个数,那就这样吧。


有兴趣不妨验证一下,嘿嘿。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用学方法和计算方法来求解这个问题。下面分别介绍两种方法。 1. 学方法 假设要求数字 k 在 1 到 N 出现次数,可以将 N 分解为两部分,分别是 k 的最高位(高位)和除去最高位后的低位部分。设 N 的最高位为 h,设除去最高位后的低位部分为 l,则有以下三种情况: 1)h < k,此时 k 在 N 的最高位出现次数为 l * 10^(n-1),其 n 是 N 的位; 2)h = k,此时 k 在 N 的最高位出现次数为 l * 10^(n-1) + (N mod 10^(n-1)) + 1; 3)h > k,此时 k 在 N 的最高位出现次数为 (l + 1) * 10^(n-1)。 参照以上三种情况,可以递归地求解出 1 到 N k 出现次数。具体实现可以参考下面的 Java 代码: ``` public static int countDigitOne(int n, int k) { if (n <= 0 || k < 1 || k > 9) { return 0; } int res = 0; int digit = 1; int high = n / 10; int cur = n % 10; int low = 0; while (high != 0 || cur != 0) { if (cur < k) { res += high * digit; } else if (cur == k) { res += high * digit + low + 1; } else { res += (high + 1) * digit; } low += cur * digit; cur = high % 10; high /= 10; digit *= 10; } return res; } ``` 2. 计算方法 另一种方法是直接计算 1 到 N k 出现次数。具体实现可以参考下面的 Java 代码: ``` public static int countDigitOne(int n, int k) { if (n <= 0 || k < 1 || k > 9) { return 0; } int res = 0; int factor = 1; int high = n / 10; int cur = n % 10; int low = 0; while (high != 0 || cur != 0) { if (cur == k) { res += high * factor + low + 1; } else if (cur < k) { res += high * factor; } else { res += (high + 1) * factor; } low += cur * factor; cur = high % 10; high /= 10; factor *= 10; } return res; } ``` 以上两种方法都可以求解从 1 到 N 出现次数,具体使用哪种方法可以根据实际情况选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值