没有改变算法,只是把输入模块完善了下 现在有一个交互界面可以让用户自行输入。
main.c
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include "array.h"
#include "display.h"
#include "char.h"
#define length 20
int main(void) {
int length_z = 0;
int length_sgs = 0;
int length_sgs1 = 0;
int length_sgs2 = 0;
short sgs[length] = { 0 };
short sgs1[length] = { 0 };
short sgs2[length] = { 0 };
length_sgs = getnum(sgs, length);
//读取输入的数组,跳过0,字母,符号,返回数组长度
diplay(length_sgs, length_sgs1, length_sgs2, sgs, sgs1, sgs2);//打印初始数组信息
//按y确定继续,按n返回重新输入,需要一个循环
rankup(sgs, length_sgs);//对数组非零元素做升序处理
diplay(length_sgs, length_sgs1, length_sgs2, sgs, sgs1, sgs2);//打印做升序后数组信息
length_z = 2 * equal1(sgs, sgs1, sgs2, length_sgs);//对数组做相等替换;
rankdown(sgs, length_sgs);//对数组做降序处理,把0排到后面
rankup(sgs, (length_sgs - length_z));//对非0元素做升序处理
length_sgs = length_sgs - length_z;
length_sgs1 = length_z / 2;
length_sgs2 = length_z / 2;
diplay(length_sgs, length_sgs1, length_sgs2, sgs, sgs1, sgs2);//打印对sgs数组做相等替换处理后信息
while (equal2(sgs, sgs1, sgs2, length_sgs, length_sgs1, length_sgs2)) {
length_sgs -= 3;
length_sgs1 += 2;
length_sgs2++;
rankdown(sgs, length);
rankup(sgs, length_sgs);//整理sgs数组
}
diplay(length_sgs, length_sgs1, length_sgs2, sgs, sgs1, sgs2);//打印对sgs做b+c=a替换后信息
while (equal3(sgs, sgs2, length_sgs, length_sgs2)) {
length_sgs--;
length_sgs2++;
rankdown(sgs, length);
rankup(sgs, length_sgs);//整理sgs数组
}
diplay(length_sgs, length_sgs1, length_sgs2, sgs, sgs1, sgs2);//打印对sgs2做b+c=a替换后信息
system("pause");
return 0;
}
array.h
#ifndef _ARRAY_H
#define _ARRAY_H
void exchange(short *array, int m, int n) {
short temp;
temp = *(array + m);
*(array + m) = *(array + n);
*(array + n) = temp;
}//数组元素交换函数
void rankup(short *array, int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1; j++) {
if (*(array + j) > * (array + j + 1)) {
exchange(array, j, j + 1);
}
}
}
}//数组元素升序排列函数
void rankdown(short *array, int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1; j++) {
if (*(array + j) < * (array + j + 1)) {
exchange(array, j, j + 1);
}
}
}
}//数组元素降序排列函数
int equal1(short *array, short *array1, short *array2, int n) {
int equal = 0;
for (int i = 0; i < n - 2; i++) {
if (*(array + i) == *(array + i + 1)) {
equal++;
*(array1 + equal - 1) = *(array + i);
*(array + i) = 0;
*(array2 + equal - 1) = *(array + i + 1);
*(array + i + 1) = 0;
}
}
return equal;//返回其中相等的对数,0的个数是其二倍
}//相等替换函数
_Bool equal2(short *array, short *array1, short *array2, int m, int n1, int n2) {
_Bool equal = false;
int i, j, z;
for (i = 0; i < m - 2; i++) {
for (j = i + 1; j < m - 1; j++) {
for (z = i + 2; z < m; z++) {
if (*(array + i) + * (array + j) == *(array + z)) {
*(array1 + n1) = *(array + i);
*(array + i) = 0;
*(array1 + n1 + 1) = *(array + j);
*(array + j) = 0;
*(array2 + n2) = *(array + z);
*(array + z) = 0;
equal = true;
break;
} else
continue;
}
break;
}
}
return equal;
}//对原数组的b+c=a替换
_Bool equal3(short *array, short *array1, int m, int n) {
_Bool equal = false;
short temp;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m - 1; j++) {
if (*(array1 + i) == *(array + j) + * (array + j + 1)) {
temp = *(array1 + i);
*(array1 + i) = *(array + j);
*(array + j) = temp;
*(array1 + n) = *(array + j + 1);
*(array + j + 1) = 0;
equal = true;
break;
} else
continue;
}
}
return equal;
}//对新数组的b+c=a替换
#endif
display.h
#ifndef _DISPLAY_H
#define _DISPLAY_H
void print(short *array, int n) {
for (int i = 0; i < n; i++) {
printf("%2d ", array[i]);
}
} //定义打印数组函数
void diplay(int length_sgs, int length_sgs1, int length_sgs2, short sgs[20], short sgs1[20], short sgs2[20]) {
printf("%2d %2d %2d\n", length_sgs, length_sgs1, length_sgs2);
printf("原数组: ");
print(sgs, length_sgs);
printf("\n新数组1:");
print(sgs1, length_sgs1);
printf("\n新数组2:");
print(sgs2, length_sgs2);
printf("\n");
}
#endif
char.h
#ifndef _CHAR_H
#define _CHAR_H
#define length 20
int getnum(short *array, int n) { //n为数组最大长度,返回数组实际长度
int i = 0;
float ch = 1;
int _ch = 0;
printf("请依次输入需要算的牌'('不超过20张,数值在1-13之间,整数')',输入0结束输入。\n");
while (i < n && ch != 0) {
if ( scanf("%f", &ch) && ( ch == 1 || ch == 2
|| ch == 3 || ch == 4 || ch == 5 || ch == 6 || ch == 7
|| ch == 8 || ch == 9 || ch == 10 || ch == 11
|| ch == 12 || ch == 13 )) {
_ch = ch;
*(array + i) = _ch;
i++;
printf("还可继续输入%d个数字,或者输入0结束输入!\n", n - i);
while (getchar() != '\n')//清除键盘缓存
;
continue;
} else if (ch == 0) {
printf("结束输入!\n");
break;
} else {
while (getchar() != '\n')
;//清除键盘缓存
printf("请输入1-13之间的整数!输入0结束输入。\n");
continue;
}
}
return i;
}
#endif