职业摆烂人


私信TA

用户名:uq_59495985965

访问量:6507

签 名:

等  级
排  名 947
经  验 3434
参赛次数 0
文章发表 18
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

TA的其他文章

解题思路:根据题目位数最多为十六位,定义一个十七位的数组,相当于将多出来的一位作为循环判断的结束条件,最大一位定义为1,其余定义为0,让其去当前位数最小数。

从最小为开始递增,满k进一直到搜完全部。

以四位数十进制为例,开始取1000

a 0a 1a 2a 3a 4

00010
判断完后累加,注意连续的9

99090
结束判断

00001

注意事项:递增需要检查下一位是否因前一位递增而递增

(第一次写题解,注释时后面补上去的,私密马赛)


参考代码:

#include<stdio.h>

int main()

{

int a[17]={0},num=0,n,k,i=0,j;    

if(scanf("%d%d",&n,&k));

a[n-1]=1;    //取n位数的最小值

while(a[n]==0)    //当数到达n位最大值+1时结束循环

{

    for(j=0;j<n-1;j++)    //判断是否是需要的数

    {

        if(a[j]==0&&a[j+1]==0)

        break;

    }

    if(j>=n-1)    //统计数字数

    {

        num++;

    }

    a[i]++;    //从最小位a[0]自增,个位+1

    while(a[i]==k)    //第一次当个位+1满k时变0,下一位+1循环至不能满k进一为止

    {

        a[i]=0;    

        a[i+1]++;    

        i++;    //用于判断位数

    }

    i=0;    //清空位数,制个位

}

printf("%d\n",num);

}


 

0.0分

3 人评分

  评论区

  • «
  • »