给定一个整数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)
为您的变量使用更好的名称。
arrn
和temp
不太清楚。 original
和sorted
可能更好。关于c - 冒泡排序需要很长时间才能分段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54042793/