解题思路:根据题目位数最多为十六位,定义一个十七位的数组,相当于将多出来的一位作为循环判断的结束条件,最大一位定义为1,其余定义为0,让其去当前位数最小数。
从最小为开始递增,满k进一直到搜完全部。
以四位数十进制为例,开始取1000
a 0 | a 1 | a 2 | a 3 | a 4 |
0 | 0 | 0 | 1 | 0 |
9 | 9 | 0 | 9 | 0 |
0 | 0 | 0 | 0 | 1 |
注意事项:递增需要检查下一位是否因前一位递增而递增
(第一次写题解,注释时后面补上去的,私密马赛)
参考代码:
#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 人评分
C语言程序设计教程(第三版)课后习题9.6 (C语言代码)浏览:567 |
【密码】 (C语言代码)浏览:333 |
十->二进制转换 (C语言代码)浏览:1291 |
WU-整数平均值 (C++代码)浏览:1236 |
C语言程序设计教程(第三版)课后习题8.6 (C语言代码)浏览:561 |
幸运数 (C++代码)浏览:1257 |
Hello, world! (C语言代码)浏览:714 |
A+B for Input-Output Practice (VII) (C语言代码)浏览:521 |
循环入门练习5 (C语言代码)浏览:828 |
大神老白 (C语言代码)浏览:600 |