E45.【C语言】练习:输入10个整数查找找并打印不相同的数字及个数
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;
}