1.题目
输入10个整数查找找并打印不相同的数字及个数
输入示例
数组元素个数:10 20 50 30 10 60 90 70 30 10 20
输出示例
20 50 30 10 60 90 70 一共7个
2.初始代码
和E27.【C语言】练习:在一个整型数组中,只有一个数字出现一次,其他数组都是成对出现的,请找出那个只出现一次的数字文章有点不一样
三重循环
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{int arr[1000] = { 0 };int num = 0;printf("数组元素个数:");scanf("%d", &num);for (int i = 0; i < num; i++){scanf("%d", &arr[i]);}for (int i = 0; i < num; i++){for (int j = i + 1; j < num; j++)if (arr[i] == arr[j]){for (int k = j; k < num; k++){arr[k] = arr[k + 1];}num--;}}for (int i = 0; i < num; i++){printf("%d ", arr[i]);}printf("\n一共%d个", num);return 0;
}
运行结果
3.封装为函数
其实画圈处可以封装为一个自定义函数move
即
if (arr[i] == arr[j]){move(......);}
写法1:传arr
改变数组组元素(int)要传数字元素的地址(int*),因此可以传arr
if (arr[i] == arr[j]){move(arr,j,num);}
void move(int* arr,int begin,int end)
{for (int i = beign; i < end; i++){arr[k] = arr[k+1];}
}
写法2:传&arr[j]
取下标为j元素的地址&arr[j]
if (arr[i] == arr[j]){move(&arr[j],num-j,&num);}
void (int* arr,int n,int* num)
{while (n--){*arr=*(arr+1);arr++;}(*num)--;
}
4.代码查错
运行结果看起来好像没问题
但下方输出结果错误
10 20 10 20 20-->10 20 20 20-->10 20 20
发现20没有完全删除 添加if (arr[j]==arr[j-1])判断即可
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{int arr[1000] = { 0 };int num = 0;printf("数组元素个数:");scanf("%d", &num);for (int i = 0; i < num; i++){scanf("%d", &arr[i]);}for (int i = 0; i < num; i++){for (int j = i + 1; j < num; j++){if (arr[i] == arr[j]){for (int k = j; k < num; k++){arr[k] = arr[k + 1];}num--;}if (arr[j]==arr[j-1]){j--;for (int k = j; k < num; k++){arr[k] = arr[k + 1];}num--;}}}for (int i = 0; i < num; i++){printf("%d ", arr[i]);}printf("\n一共%d个", num);return 0;
}