删除数字问题

3 篇文章 0 订阅

已知n位数字正整数a,去除任意k位数,使剩下数字按原次序排列成新正整数,使其最大

C语言

#include<stdio.h>
#include<string.h>
#define N 100
int del(char a[])
{int i,j,n;
n=strlen(a);//再测一边长度,为删除位数在1以上
for(i=0;i<n;i++)
if(a[i]<a[i+1])
{j=i;
break;
 } 
 if(i==j)//乱序时,左边的数小于右边时,删掉左边的数
 for(;i<=n;i++)
 a[i]=a[i+1];
 else
 j=i-1;//正序即从大到小排列或全部相等,删除最右边数
 return j;
}
int main()
{
	char a[N];
	int i,k,n,s;
	scanf("%s",a);//输入删除数字
	scanf("%d",&k);//删除位数
	n=strlen(a);
	s=0;
	if(k<n)
{
		{for(i=1;i<=k;i++)
	if(s!=n-1)//乱序时
	s=del(a);
	else
	break;

	}
	for(i=0;i<n-k;i++)
	printf("%c",a[i]);
	printf("\n");}
	else
	printf("删除数字个数应小于长度"); 
}

重新排列最大

#include<stdio.h>
#include<string.h>
#define N 100
int del(char a[])
{int i,j,n;
n=strlen(a);//再测一边长度,为删除位数在1以上
for(i=0;i<n;i++)
if(a[i]<a[i+1])
{j=i;
break;
 } 
 if(i==j)//乱序时,左边的数小于右边时,删掉左边的数
 for(;i<=n;i++)
 a[i]=a[i+1];
 else
 j=i-1;//正序即从大到小排列或全部相等,删除最右边数
 return j;
}
int main()
{
	char a[N],m;
	int i,k,n,s;
	scanf("%s",a);//输入删除数字
	scanf("%d",&k);//删除位数
	n=strlen(a);
	s=0;
	if(k<n)
{
		{for(i=1;i<=k;i++)
	if(s!=n-1)//乱序时
	s=del(a);
	else
	break;

	}
	for(i=0;i<n-k-1;i++)
	if(a[i]<a[i+1])
	{m=a[i];
	a[i]=a[i+1];
	a[i+1]=m;
	}
	for(i=0;i<=n-k;i++)
	printf("%c",a[i]);
	printf("\n");}
	else
	printf("删除数字个数应小于长度"); 
}

使其最小

#include<stdio.h>
#include<string.h>
#define N 100
int del(char a[])
{int i,j,n;
n=strlen(a);//再测一边长度,为删除位数在1以上
for(i=0;i<n;i++)
if(a[i]>a[i+1])
{j=i;
break;
 } 
 if(i==j)//乱序时,左边的数大于右边时,删掉左边的数
 for(;i<=n;i++)
 a[i]=a[i+1];
 else
 j=i-1;//正序即从大到小排列或全部相等,删除最左边数
 return j;
}
int main()
{
	char a[N];
	int i,k,n,s;
	scanf("%s",a);//输入删除数字
	scanf("%d",&k);//删除位数
	n=strlen(a);
	s=0;
	if(k<n)
{
		{for(i=1;i<=k;i++)
	if(s!=n-1)//乱序时
	s=del(a);
	else
	break;

	}
	for(i=0;i<n-k;i++)
	printf("%c",a[i]);
	printf("\n");}
	else
	printf("删除数字个数应小于长度"); 
}

重新排列最小

#include<stdio.h>
#include<string.h>
#define N 100
int del(char a[])
{int i,j,n;
n=strlen(a);//再测一边长度,为删除位数在1以上
for(i=0;i<n;i++)
if(a[i]>a[i+1])
{j=i;
break;
 } 
 if(i==j)//乱序时,左边的数小于右边时,删掉左边的数
 for(;i<=n;i++)
 a[i]=a[i+1];
 else
 j=i-1;//正序即从大到小排列或全部相等,删除最右边数
 return j;
}
int main()
{
	char a[N],m;
	int i,k,n,s;
	scanf("%s",a);//输入删除数字
	getchar();
	scanf("%d",&k);//删除位数
	n=strlen(a);
	s=0;
	if(k<n)
{
		{for(i=1;i<=k;i++)
	if(s!=n-1)//乱序时
	s=del(a);
	else
	break;

	}
	for(i=0;i<n-k-1;i++)
	if(a[i]>a[i+1])
	{m=a[i];
	a[i]=a[i+1];
	a[i+1]=m;
	}
	for(i=0;i<=n-k;i++)
	printf("%c",a[i]);
	printf("\n");}
	else
	printf("删除数字个数应小于长度"); 
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值