C语言编译时没问题,但运行有问题,帮忙找一下逻辑错误,主要是数组出问题,好像写不进去数,谢谢!

题目:给定n 位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新的正整数。对于给定的n位正整数a 和正整数k,设计一个算法找出剩下数字组成的新数最小的删数方案。 对于给定的正整数a,编程计算删去k个数字后得到的最小数。
以下是我编代码:
#include "stdio.h"
#include "math.h"
#define P 10
int weishu( long n) //算出n的位数
{int weishu=0;
do
{n=n/10;
weishu++;
} while(n!=0);
return weishu;
}
void chaishu(int *p,int n)// 拆数
{int i,w; long sum;

for(i=0;i<=w;i++)
{w=weishu(n)-i;
*(p+i)=n/pow(10,w);
sum=*(p+i)*(int)pow(10,w);
n=n-sum;

}

}
void shanshu(int *p,int *r,int n,int s)//删数
{int j,k,l,m=0;
for(j=0;j<=weishu(n)-1-m;j++)
for(k=0;k<=weishu(s);k++)
if(*(p+j)==*(r+k))
for(l=j;l<weishu(n);l++)
{ *(p+l)=*(p+l+1);
m++;
}

}
void maopao(int str[],int n,int s)//冒泡排序
{int a,b,temp;
for(a=0;a<=weishu(n)-weishu(s);a++)
for(b=0;b<weishu(n)-weishu(s)-a;b++)
if(str[b]>str[b+1])
{temp=str[b];str[b]=str[b+1];str[b+1]=temp;}

}
main()
{ long n,s; int a,b,w; int str4[P]; int str5[P];
printf("intput:\n");
scanf("%d",&n);
chaishu(str4,n);
printf("delete:\n");
scanf("%d",&s);
chaishu(str5,s);
shanshu(str4,str5,n,s);
maopao(str4,n,s);
w=weishu(n)-weishu(s);
for(a=0;a<=w;a++) //判断数组开始的数是否为0
if(str4[a]!=0) break;
for(b=a;b<=w;b++)//输出
printf("%d",str4[a]);

}

编译没有问题,是数组出问题,帮一下忙,谢谢啊!!!
我有找到一些错误,现改为如下:
把void chaishu(int *p,int n)// 拆数
{int i,w; long sum;

for(i=0;i<=w;i++)
{w=weishu(n)-i;
*(p+i)=n/pow(10,w);
sum=*(p+i)*(int)pow(10,w);
n=n-sum;

}

}
改为:void chaishu(int *p,int n)// 拆数
{int i,w; long sum;

for(i=0;i<=weishu(n);i++)
{w=weishu(n)-i-1;
*(p+i)=n/pow(10,w);
sum=*(p+i)*pow(10,w);

第1个回答  推荐于2016-07-14
修改如下:
#include "stdio.h"
#include "math.h"
#define P 10
int weishu( long n) //算出n的位数
{int weishu=0;
do
{n=n/10;
weishu++;
} while(n!=0);
return weishu;
}
void chaishu(int *p,int n)// 拆数
{int i,w; long sum;
w=weishu(n);//加
for(i=0;i<=w;i++)
{//w=weishu(n)-i;
*(p+i)=n/pow(10,w-i-1);//*(p+i)=n/pow(10,w);
sum=*(p+i)*(int)pow(10,w-i-1);//sum=*(p+i)*(int)pow(10,w);
n=n-sum;

}

}
void shanshu(int *p,int *r,int n,int s)//删数
{int j,k,l,m=0;
for(j=0;j<=weishu(n)-1-m;j++)
for(k=0;k<weishu(s);k++)//for(k=0;k<=weishu(s);k++)
if(*(p+j)==*(r+k))
for(l=j;l<weishu(n);l++)
{ *(p+l)=*(p+l+1);
m++;
}

}
void maopao(int str[],int n,int s)//冒泡排序
{int a,b,temp;
for(a=0;a<weishu(n)-weishu(s);a++)//for(a=0;a<=weishu(n)-weishu(s);a++)
for(b=0;b<weishu(n)-weishu(s)-a;b++)
if(str[b]>str[b+1])
{temp=str[b];str[b]=str[b+1];str[b+1]=temp;}

}
main()
{ long n,s; int a,b,w; int str4[P]; int str5[P];
printf("intput:\n");
scanf("%d",&n);
chaishu(str4,n);
printf("delete:\n");
scanf("%d",&s);
chaishu(str5,s);
shanshu(str4,str5,n,s);
maopao(str4,n,s);
w=weishu(n)-weishu(s);
for(a=0;a<=w;a++) //判断数组开始的数是否为0
if(str4[a]!=0) break;
for(b=a;b<=w;b++)//输出
printf("%d",str4[b]);//printf("%d",str4[a]);

}

如果按字符串处理,就比较简单。本回答被提问者采纳
第2个回答  2011-04-09
看得比较费劲,自己写了一个,希望对你有帮助:
/*
题目:给定n 位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新的正整数。
对于给定的n位正整数a 和正整数k,设计一个算法找出剩下数字组成的新数最小的删数方案。
对于给定的正整数a,编程计算删去k个数字后得到的最小数。
*/
#include<stdio.h>
#define LENGTH 100
int arr_yuan[LENGTH]={0};
void devide(long a,int n)
{
int i,j;
for(i=0;i<n;i++)//拆分a
{
arr_yuan[i]=a%10;
a/=10;
}
int temp;
for(i=0;i<n;i++)//升序排序
{
for(j=i;j<n;j++)
{
if(arr_yuan[j]<=arr_yuan[i])
{
temp=arr_yuan[j];
arr_yuan[j]=arr_yuan[i];
arr_yuan[i]=temp;
}
}
}
}
int main()
{
long a,sum=0;
int n,index,k;
printf("请输入n位正整数a:\n");
scanf("%d%d",&n,&a);//输入n位正整数a
printf("请输入要删除的位数k:\n");
scanf("%d",&k);//输入 需要删除多少位数字
devide(a,n);//将a的每一位拆分出来保存到数组arr_yuan中 并将arr_yuan数组升序排序
for(index=0;index<n-k;index++)//去掉n-k到n位数字,前面的0-(n-k-1)位数字即为最小,然后将该数组合并即得结果
{
sum+=arr_yuan[index];
if(index<(n-k-1))
{
sum*=10;
}
}
printf("The result is %ld:\n",sum);//输出结果
return 0;
}
第3个回答  2011-04-09

我运行可以啊

追问

好像结果是错误的啊,你编译运行了还会出数字,我运行了只会出现我所截的图那样,你再试试,至少结果要对,也许我的编译器出问题。

追答

不知道你的程序是干什么的,没有详细看代码,你试试这样int str4[P]={0};
int str5[P]={0};

第4个回答  2011-04-10
for(a=0;a<=w;a++) //判断数组开始的数是否为0
if(str4[a]!=0) break;
for(b=a;b<=w;b++)//输出
printf("%d",str4[a]); //=============话说不应该是str[b]吗?

}
相似回答