2017.6.4 入门组 NO.1——k好数

本文介绍了两种算法来解决计数不超过k的数字的问题。一种是暴力枚举算法,通过直接检查每个数字的每一位来确定其是否符合条件;另一种是动态规划算法,通过分析数字位之间的关系递归地解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述


方法①
    数据1<=n<=1000000,时间复杂度最大O(1000000*6)
    暴力足够了,于是,便开始码暴力:
    循环枚举i,将i转为字符串,每一位的判断是否超过k:如果每一位都没超过就+1

方法②动态规划
    找一找每一位于上一位的关系,可以发现。
    设n=236,k=5,如果最后一位的数x大于k,则上一位数,只能取3+1种,所以(k+1)*f[i-1]
    设n=234,k=5,如果最后一位x小于或等于k,则上一位数,能取x种,所以g+x*k

方法①代码:

var  n,k,i,j,o,l:longint;
     s:string;
begin
  readln(n,k);
  for i:=1 to n do
    begin
      str(i,s);
      o:=0;
      for j:=1 to length(s) do
        if ord(s[j])-48>k then
          begin
            o:=1; break;
          end;
      if o=0 then inc(l);
    end;
  write(l);
end.

方法②代码:

var n,k,x,g,f:int64;
begin
  readln(n,k);
  f:=1;
  g:=1;
  while n>0 do
    begin
      x:=n mod 10; n:=n div 10;
      if x>k then g:=f*(k+1)
             else g:=g+f*x;
      f:=f*(k+1);
    end;
  write(g-1);
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值