C 如何查看数组中的数字是否相同?
我有点被我的一个问题困住了,不是因为我不知道,而是因为我不能使用更复杂的操作。(函数和多个数组) 所以我需要用C语言编写一个程序,要求输入一个数组(最多100个元素),然后程序需要用相同的数字对矩阵进行排序 所以我做了我所知道的一切,我用从最小值到最大值的排序算法测试了我的程序,它是有效的,唯一我不明白的是我应该如何测试循环中的数字是否相同?(我不能使用函数。) 所以我知道找到数字是否有相同数字的方法,但我不知道如何比较它们。这是我需要的一个例子 这就是我现在所拥有的,它将数字从最小值排序到最大值C 如何查看数组中的数字是否相同?,c,algorithm,C,Algorithm,我有点被我的一个问题困住了,不是因为我不知道,而是因为我不能使用更复杂的操作。(函数和多个数组) 所以我需要用C语言编写一个程序,要求输入一个数组(最多100个元素),然后程序需要用相同的数字对矩阵进行排序 所以我做了我所知道的一切,我用从最小值到最大值的排序算法测试了我的程序,它是有效的,唯一我不明白的是我应该如何测试循环中的数字是否相同?(我不能使用函数。) 所以我知道找到数字是否有相同数字的方法,但我不知道如何比较它们。这是我需要的一个例子 这就是我现在所拥有的,它将数字从最小值排序到最大
#include <stdio.h>
int main() {
int matrix[100];
int i,j;
int temp,min;
int elements_number=0;
printf("Enter the values of matrix-max 100 elements-type -1 to end: ");
for(i=0;i<100;i++){
scanf("%d",&matrix[i]);
elements_number++;
if(matrix[i]==-1){
elements_number--;
break;
}
}
for (i=0; i<elements_number; i++) {
min=i;
for (j=i+1; j<elements_number; j++) {
if (matrix[j] < matrix[min])
min = j;
}
temp = matrix[i];
matrix[i] = matrix[min];
matrix[min] = temp;
}
for(i=0;i<elements_number;i++){
if(i!=elements_number-1){
printf("%d,",matrix[i]); }
else printf("%d.",matrix[i]);
}
return 0;
}
具有1位数的整数计数为“具有相同位数的数字”,如本例中的7和1
希望您能提供帮助。处理完数组后,单个数字应全部位于数组的左侧,其他数字应位于右侧。在每个部分中,应保留元素的原始顺序。这称为稳定分区。它与排序不同,因为元素只分为两组。排序意味着数组中任意两个元素之间存在明确的关系 这可以通过“过滤”数组中的单个数字并将过滤出的其他数字存储在临时的第二个数组中来实现。然后将第二个数组的内容附加到(现在更短的)第一个数组 以下是如何做到这一点:
#include <stdlib.h>
#include <stdio.h>
void print(const int *arr, int n)
{
for (int i = 0; i < 10; i++) {
if (i) printf(", ");
printf("%d", arr[i]);
}
puts(".");
}
int is_rep_digit(int n)
{
int q = n % 10;
n /= 10;
while (n) {
if (n % 10 != q) return 0;
n /= 10;
}
return 1;
}
int main()
{
int arr[10] = {1, 22, 43, 444, 51, 16, 7, 8888, 90, 11};
int aux[10]; // auxliary array for numbers with several digits
int i, j, k;
print(arr, 10);
j = 0; // number of single-digit numbers
k = 0; // number of other numbers
for (i = 0; i < 10; i++) {
if (is_rep_digit(arr[i])) {
arr[j++] = arr[i]; // pick single-digit number
} else {
aux[k++] = arr[i]; // copy other numbers to aux
}
}
k = 0;
while (j < 10) { // copy aux to end of array
arr[j++] = aux[k++];
}
print(arr, 10);
return 0;
}
#包括
#包括
无效打印(常量整型*arr,整型n)
{
对于(int i=0;i<10;i++){
如果(i)printf(“,”);
printf(“%d”,arr[i]);
}
认沽权(“.”);
}
int是代表数字(int n)
{
int q=n%10;
n/=10;
while(n){
如果(n%10!=q)返回0;
n/=10;
}
返回1;
}
int main()
{
int arr[10]={1,22,43,444,51,16,78888,90,11};
int aux[10];//多位数数字的辅助数组
int i,j,k;
打印(arr,10);
j=0;//个位数
k=0;//其他数字的数目
对于(i=0;i<10;i++){
if(是代表数字(arr[i])){
arr[j++]=arr[i];//选择一位数
}否则{
aux[k++]=arr[i];//将其他数字复制到aux
}
}
k=0;
而(j<10){//copy aux到数组的末尾
arr[j++]=aux[k++];
}
打印(arr,10);
返回0;
}
编辑:我刚刚看到了您不能使用函数的要求。你可以用Barmar的建议来测试1,11,111等等的整除性。然而,棘手的部分是找到正确的除数
无论如何,我想在这里指出的一点是,这里不需要完整的排序算法。如果一个数字在10到99之间,如果它是11的倍数,那么它的数字是相同的。如果它在100和999之间,测试它是否是111的倍数。如果它在1000到9999之间,测试它是否是1111的倍数。你看到一个模式了吗?你是说,按唯一数字的数量排序
qsort
可以很容易地做到这一点,但它不是一个稳定的排序(稳定性重要吗?),它需要一个函数。非常感谢您花费时间和精力编写整个代码,我可以使用它的一部分将其与我的代码结合起来,因为我现在理解了逻辑。我可以将is_rep_digit函数放入循环中,并使用矩阵[I](作为参数n)来测试它是否是,如果是,我会将条件设置为1(例如cond1==1),如果数字相同(如果cond1==1),然后使用该索引将元素放在矩阵的第一个位置,以此类推。谢谢对您可以使用变量is_single
并将其设置为1。然后,将其设置为0,而不是在内部循环中返回0。(你也可以打破循环以获得最小的加速,但我不担心像你这样的小问题。)然后你使用is_single
来决定你的号码放在哪里。
#include <stdlib.h>
#include <stdio.h>
void print(const int *arr, int n)
{
for (int i = 0; i < 10; i++) {
if (i) printf(", ");
printf("%d", arr[i]);
}
puts(".");
}
int is_rep_digit(int n)
{
int q = n % 10;
n /= 10;
while (n) {
if (n % 10 != q) return 0;
n /= 10;
}
return 1;
}
int main()
{
int arr[10] = {1, 22, 43, 444, 51, 16, 7, 8888, 90, 11};
int aux[10]; // auxliary array for numbers with several digits
int i, j, k;
print(arr, 10);
j = 0; // number of single-digit numbers
k = 0; // number of other numbers
for (i = 0; i < 10; i++) {
if (is_rep_digit(arr[i])) {
arr[j++] = arr[i]; // pick single-digit number
} else {
aux[k++] = arr[i]; // copy other numbers to aux
}
}
k = 0;
while (j < 10) { // copy aux to end of array
arr[j++] = aux[k++];
}
print(arr, 10);
return 0;
}