无套路,均已上机通过,求个关注求个赞,提供答疑解惑服务。
编写程序,输入一个正整数n,构造一个正整数的数字金字塔。例如对n=6,数字金字塔如下:
1
2 3 5
4 6
数字金字塔构造规则如下:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
/**
* 链表结点
*/
typedef struct Node {
int data;
struct Node *next;
} *Node;
/**
* 获取插入数据的所在层数
* 在获取层次时,从金字塔的最高层开始比较,如果找不到就递归到上一层查找,这样可以保证每个数插入到最大层
* @param pyramid 数字金字塔
* @param level 当前最大层级
* @param data 插入的数据
* @return 返回插入数据的所在层数
*/
int getLevel(Node pyramid[], int level, int data) {
for (Node node = pyramid[level - 1]; node != NULL; node = node->next) {
if (data > node->data && data % node->data == 0) {
return level + 1;
}
}
return getLevel(pyramid, level - 1, data);
}
/**
* 插入数据
* @param pyramid 数字金字塔
* @param level 插入数据所在层数
* @param data 插入数据
*/
void insertData(Node pyramid[], int level, int data) {
Node node = malloc(sizeof(struct Node));
node->data = data;
node->next = NULL;
//如果所在层次为空则直接插入,否则就寻找插入的位置,这个过程保证链表有序
if (pyramid[level - 1] == NULL) {
pyramid[level - 1] = node;
} else {
for (Node temp = pyramid[level - 1]; temp != NULL; temp = temp->next) {
if (data > temp->data && (temp->next == NULL || temp->next->data > data)) {
node->next = temp->next;
temp->next = node;
break;
}
}
}
}
/**
* 金字塔构造函数
* @param pyramid 数字金字塔
* @param n 输入n
* @return 金字塔的最大层数
*/
int constructPyramid(Node pyramid[], int n) {
int level = 1;
//从1-n依次寻找每一个数的插入层次并插入
for (int data = 1; data <= n; ++data) {
//如果是1就直接插入到第一层,某则就先获取待插入数据所在的层次,然后再进行插入
if (data == 1) {
Node node = malloc(sizeof(struct Node));
node->data = data;
node->next = NULL;
pyramid[level - 1] = node;
} else {
int insertLevel = getLevel(pyramid, level, data);
insertData(pyramid, insertLevel, data);
//如果插入元素在新的一层,金字塔的最大高度就+1
if (insertLevel > level) {
level++;
}
}
}
return level;
}
/**
* 打印金字塔
* @param pyramid 数字金字塔
* @param level 金字塔的最大层数
*/
void printPyramid(Node pyramid[], int level) {
for (int i = 1; i <= level; ++i) {
for (Node node = pyramid[i - 1]; node != NULL; node = node->next) {
printf(" %d", node->data);
}
printf("\n");
}
}
/**
* 打印排名
* @param pyramid 数字金字塔
* @param level 数字金字塔的最大层数
* @param inputDataList 需要打印排名的数据
*/
void printRank(Node pyramid[], int level, int inputDataList[]) {
printf("输出排名:\n");
for (int i = 1; i <= 3; ++i) {
int rank = 0;
for (int j = 1; j <= level; ++j) {
for (Node node = pyramid[j - 1]; node != NULL; node = node->next) {
rank++;
if (node->data == inputDataList[i]) {
printf(" %d,", rank);
break;
}
}
}
}
printf("\n");
}
int main() {
while (true) {
int inputDataList[4] = {0};
printf("输入信息:\n");
for (int i = 0; i < 4; ++i) {
//注意输入时的逗号是英文状态下的逗号
scanf("%d,", inputDataList + i);
}
//金字塔的结构是一个数组,数组的每个元素代表一层,一层的多个元素用链表存储
Node pyramid[10] = {NULL};
int level = constructPyramid(pyramid, inputDataList[0]);
printPyramid(pyramid, level);
printRank(pyramid, level, inputDataList);
}
return 0;
}