给定一个整数
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);
}
我能够编译代码,但是当我执行它时,花很长时间才显示出分段错误。
答案 0 :(得分:1)
简单的答案,使用调试器。
您的代码有问题:
在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)
您应该编写一个功能并确保其正常工作,而不是一次编写多个功能。顺便说一下,将数字分解为数字的循环也可以是一个函数。
arrn
和temp
不太清楚。 original
和sorted
可能更好。答案 1 :(得分:0)
您的长度函数有一个非常明显的错误。 l
以什么值开头?您无需对其进行初始化,因此它可以以任何值开头并导致未定义的行为。您应该将其设置为0。
int length(int n)
{
int l = 0;
while (n!=0)
{
n=n/10;
l++;
}
return l;
}
答案 2 :(得分:0)
就我个人而言,我不会将其排序或读取为int -以便能够处理数字字符串中的前导零。例如:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXNUMLEN 200
int main(void)
{
int i, j, l, x=0;
char numin[MAXNUMLEN], numout[MAXNUMLEN];
int digits[10]={0};
printf("enter a string of digits: " );
fgets(numin, sizeof(numin), stdin);
printf("\nsaw : %s", numin );
// walk string once, counting num of each digit present
l=strlen(numin);
for(i=0; i<l; i++) {
if( isdigit(numin[i]) ) {
int d = numin[i] - '0'; // char digit to int digit
digits[d]++;
}
}
// for each digit present, write the number of instances of the digit to numout
for( i=0; i<10; i++ ) {
for(j=0; j<digits[i]; j++)
numout[x++] = '0'+i; // int digit back to char digit
}
numout[x]='\0'; // terminate string
printf("sorted: %s\n", numout );
}
样品运行:
watson:digsort john$ ./ds
enter a string of digits: 002342123492738234610
saw : 002342123492738234610
sorted: 000112222233334446789
watson:digsort john$