题目:给定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);