给定一个整数n,编写一个C程序,以在以m但数字升序形成一个整数n之后,计算在同一位置的位数。例如,如果n的值为351462987,则m的值为123456789,数字4和8将位于同一位置。


这是我的代码:

#include<stdio.h>

void bubble(int a[],int length)
{
    for (int i=0;i<length;i++)
    {
        for (int j=0;j<length;j++)
        {
            if (a[j]>a[j+1])
            {
                int t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
    }
}
int check(int a[],int b[],int length)
{
    int count=0;
    for (int i=0;i<length;i++)
    {
        if (a[i]==b[i])
        {
            count=i;
            break;
        }
    }
    return count;
}
int length(int n)
{
    int l;
    while (n!=0)
    {
        n=n/10;
        l++;
    }
    return l;
}
void main()
{
    int n,arrn[100],temp[100];
    scanf("%d",&n);
    int l=length(n);
    for (int i=0;i<l;i++)
    {
        arrn[l-i-1]=n%10;
        temp[l-i-1]=arrn[l-i-1];
        n=n/10;
    }
    bubble(temp,l);
    int c=check(arrn,temp,l);
    printf("%d",c);
}


我可以编译代码,但是执行时只花很长时间才能显示分段错误。

最佳答案

简单的答案,使用调试器。

这是您的代码的一些问题:


length函数中,l未初始化,因此可以具有任意初始值。在您的情况下,您可能希望从0开始。

int l = 0;

您的check函数可能不执行您想要的操作。按照书面形式,count不是计数,而是数字匹配的位置的索引。由于该块中有一个break语句,因此循环将在第一个匹配项后退出,因此返回值将是第一个匹配项的位置,如果找不到匹配项,则返回值为0。
bubble等于i时,当您访问超出范围的内部循环中的项目length - 1时,您的a[j + 1]函数会超出一项。在这种情况下,从1而不是0开始比较索引i - 1的项目与索引i的项目比较简单。


一些额外的注意事项:


建议在运算符前后以及用逗号分隔多个声明之后添加空格,以提高可读性。这是一些具有提高的可读性的行示例。

int n, arrn[100], temp[100];
int count = 0;
for (int i = 0; i < length; i++)…
if (a[i] == b[i])…
arrn[l - i - 1] =n % 10;
temp[l - i - 1] = arrn[l - i - 1];
int check(int a[], int b[], int length)

您应该编写一个功能并确保其正常工作,而不是一次编写多个功能。顺便说一句,将数字分解为数字的循环也可以是一个函数。


尝试少量的功能(例如12或21)
为您的变量使用更好的名称。 arrntemp不太清楚。 originalsorted可能更好。

关于c - 冒泡排序需要很长时间才能分段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54042793/

10-11 22:05