其实就是一个字符匹配的问题,我用结构体,flag表示这个数是否被匹配过。
这一题做的也还算顺畅,没什么问题,最后将结果用flag判断,在放入一个新的数组,这个数组用冒泡排序排序,即可输出结果。
但是测试题给出的数据应该较大,后来我把数组大小调到10000才全部编译通过。我觉得我的方法太烦,太占用空间和时间。还需要找到别人的方法。
po一下自己的垃圾代码,但起码运行出来了。
#include<stdio.h>
typedef struct num {
int n;
int flag;
}num;
int main()
{
int K;
scanf("%d", &K);
num number[10000];
for (int i = 0; i < K; i++) {
scanf("%d", &number[i].n);//输入K个字符
number[i].flag=0;
}
int number1[10000];
for(int i=0;i<K;i++){
number1[i]=number[i].n;
}
int j = 0;
int outcom[10000];
for (int i = 0; i < K; i++) {
//将计算切割数的过程的数字记录在outcom数组中
while (number[i].n != 1) {
if (number[i].n % 2 == 0) {
number[i].n = number[i].n / 2;
outcom[j] = number[i].n;
j++;
}
else {
number[i].n = (3*number[i].n+1) / 2;
outcom[j] = number[i].n;
j++;
}
}
//下面开始字符的匹配
for (int m = 0; m < j; m++) {
for (int n = 0; n < K; n++) {
if (outcom[m] == number1[n]) number[n].flag = 1;
}
}
}
int l = 0;
int outcome[10000];
for (int m = 0; m < K; m++) {
if (number[m].flag == 0) {
outcome[l] = number1[m];
l++;
}
}
//对输出结果l个数进行冒泡排序
for (int i = 0; i < l - 1; i++) {
for (int j = 0; j < l - 1 - i; j++) {
int temp = outcome[j];
if (outcome[j] < outcome[j + 1]) {
outcome[j] = outcome[j + 1];
outcome[j + 1] = temp;
}
}
}
for (int i = 0; i < l - 1; i++) {
printf("%d ", outcome[i]);
}
printf("%d", outcome[l-1]);
return 0;
}
看了别人的,感觉思路和我的差不多。那就浅摆一下,不改了,耶比。