解题思路:
回顾一下题目要求,考虑包含N位数字的K-进制数,如果在该N位K-进制数中不包含两个连续的0,则将其定义为一个有效数,统计所有有效N位K-进制数的数量。阅读完题目,或许应该考虑到解题的关键是如何确定其为一个有效数。结合题目的要求,有效数要不包含两个连续的0(当然,0也不能在开头),再结合已经学过的排列组合知识,即要求两个元素互不相邻,所以可以将问题转化为0的优先排列问题(也就是插空法),即先确定N位数字中0的具体位置,再将剩余位数按照K-进制的数字范围,取所有的非0数字即可。
注意事项:
1.在代码中,使用了两个变量 n 、 m 来分别标记 0 、 非0数 的数量情况,这里要注意 m + n 的和要始终等于总位数 N ,另外 0 的数量一定要小于等于 非0数 的数量,否则一定会出现非有效数的情况
2.在优先排列 0 时,要注意是组合问题,且每次当 m 改变时, 0 的可排列位数也在改变
参考代码:
#include<stdio.h> #include<math.h> int B_th(int m, int n, int K); int Fac(int num); int main() { int N, K, sum = 0; scanf("%d %d", &N, &K); int m = N, n = 0; while(n <= m) { sum += B_th(m, n, K); n++; m--; } printf("%d", sum); return 0; } int Fac(int num) { if(num == 0) { return 1; } else { return (num * Fac(num - 1)); } } int B_th(int m, int n, int K) { int sum; sum = Fac(m) / Fac(m - n) / Fac(n) * pow((K - 1), m); return sum; }
0.0分
4 人评分
C语言考试练习题_保留字母 (C语言代码)浏览:686 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:521 |
Hello, world! (C语言代码)浏览:1198 |
多输入输出练习1 (C语言代码)浏览:1181 |
字符串对比 (C语言代码)浏览:1401 |
拆分位数 (C语言代码)浏览:1327 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:1283 |
C语言训练-大、小写问题 (C语言代码)浏览:724 |
WU-输入输出格式练习 (C++代码)浏览:1079 |
剪刀石头布 (C语言代码)浏览:751 |