题目背景:
本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。
题目描述
将 1,2,…,91,2,…,9 共 99 个数分成 33 组,分别组成 33 个三位数,且使这 33 个三位数构成 1:2:31:2:3 的比例,试求出所有满足条件的 33 个三位数。
输入格式
无
输出格式
若干行,每行 33 个数字。按照每行第 11 个数字升序排列。
输入输出样例
输入 #1
无
输出 #1
192 384 576 * * * ... * * * (剩余部分不予展示)
题目来源
思路及部分代码:
1. 判断三个数是否满足要求
void calculate_end(void){
int en = 1;
//判断是否有位数相同
for(int i=0;i<8;i++){
for(int j=i+1;j<9;j++){
if(number[i]==number[j]) en = 0;
}
}
//如果满足使有要求
if(en == 1){
number_three[0] = number[0]*100 + number[1] * 10 + number[2];
number_three[1] = number[3]*100 + number[4] * 10 + number[5];
number_three[2] = number[6]*100 + number[7] * 10 + number[8];
if(number_three[0]*2==number_three[1] && number_three[0]*3 == number_three[2])
printf("%d %d %d\r\n",number_three[0],number_three[1],number_three[2]);
}
return ;
}
2. 使用递归遍历出1--9的所有数
void calculate(int n){
if(n>=9){
calculate_end();
return;
}
for(int i=1;i<10;i++){
number[n] = i;
//n++;
calculate(n+1);
}
}
总代码:
#include <stdio.h>
/*运行结果
192 384 576
219 438 657
273 546 819
327 654 981
*/
int number[9];
int number_three[3];
void calculate_end(void){
int en = 1;
//判断是否有位数相同
for(int i=0;i<8;i++){
for(int j=i+1;j<9;j++){
if(number[i]==number[j]) en = 0;
}
}
//如果满足使有要求
if(en == 1){
number_three[0] = number[0]*100 + number[1] * 10 + number[2];
number_three[1] = number[3]*100 + number[4] * 10 + number[5];
number_three[2] = number[6]*100 + number[7] * 10 + number[8];
if(number_three[0]*2==number_three[1] && number_three[0]*3 == number_three[2])
printf("%d %d %d\r\n",number_three[0],number_three[1],number_three[2]);
}
return ;
}
void calculate(int n){
if(n>=9){
calculate_end();
return;
}
for(int i=1;i<10;i++){
number[n] = i;
//n++;
calculate(n+1);
}
}
int main(){
//初始化 0
for(int i= 0;i<9;i++) number[i]=0;
calculate(0);
return 0;
}
总结:
calculate_end
函数用于判断当前的九个数字是否满足条件,并在满足条件时计算并输出满足条件的三个三位数。calculate
函数是一个递归函数,用于生成所有可能的九个数字组合。main
函数初始化了九个数字为0,并调用了calculate
函数开始递归生成数字组合。
不足之处:
- 可能存在未初始化的变量:在
main
函数中,number_three
数组未初始化即被使用,这可能导致不确定的行为。 - 递归深度过深:由于程序使用了递归,会导致递归深度过深,增加了程序的运行时间和内存消耗。
改进建议:
- 初始化变量:在使用
number_three
数组之前,应该对其进行初始化。 - 优化递归算法:考虑优化递归算法,减少递归深度,提高程序的效率。