算法分析:一个正整数删除s个数后,求剩余整数最大值

一个正整数删除s个数后,求最大值

分类

1. s个数是随机的,不连续
2. s个数是连续的

s个数随机的

思路

1. 将正整数转化为整数数组
    在cpp的cmath库内有函数 log10() 可得到整数的位数

故用下面的函数表示将正整数变为数组:

void arrForInt(int number){
	int n = int(log10(number) + 1);
    for (int i = 0; i < n; i++)
    {
        arr[i] = number % 10;
        number /= 10;
    }
    //将转化的倒叙数组,变为正常的数组
    for (int start = 0, end = n - 1; start < end; start++, end--)
    {
        int temp = arr[start];
        arr[start] = arr[end];
        arr[end] = temp;
    }
}

2. 对得到的数组进行排序

这里使用冒泡排序:

	for (int i = 0; i<N - 1; i++) { 
		for (int j = 0; j<N - 1 - i; j++)
		{
			if (a[j]>a[j + 1]) { 
				int tmp; 
				tmp = a[j]; 
				a[j] = a[j + 1];
				a[j + 1] = tmp;
			}
		}
	}
3. 去掉数组中的最小的s个数
	//删除最小的S个数
	for (int i = 0; i < N; i++){
		for (int j = 0; j < S; j++){
			if (noSortArr[i] == a[j])
				noSortArr[i] = 0;
		}
	}

完整代码为:

#include <iostream>
#include <cmath>
using namespace std;

int main(){
	int S;
	int number;
	cout << "input the number: ";
	cin >> number;
	cout << "input the S: ";
	cin >> S;
	int N = int(log10(number))+1;
	int a[N],noSortArr[N];
	//把整数转化为数组
	for(int i = 0;number != 0; i++){
		a[i] = number%10;
		noSortArr[i] = number%10;
		number /= 10;
	}
	//从小到大排序
	for (int i = 0; i<N - 1; i++) { 
		for (int j = 0; j<N - 1 - i; j++)
		{
			if (a[j]>a[j + 1]) { 
				int tmp; 
				tmp = a[j]; 
				a[j] = a[j + 1];
				a[j + 1] = tmp;
			}
		}
	}
	//删除最小的S个数
	for (int i = 0; i < N; i++){
		for (int j = 0; j < S; j++){
			if (noSortArr[i] == a[j])
				noSortArr[i] = 0;
		}
	}
	//打印删除s个数后最大的数
	for (int i = N; i > 0;i--)
		if(noSortArr[i] != 0)
			cout << noSortArr[i];
	return 0;
}

当s个数是连续的时候

1. 将正整数number转化为整数数组 arr[n]; n = int(log10(number)+1);

方法同第一种情况

void arrForInt(int number)
{
    int n = int(log10(number) + 1);
    for (int i = 0; i < n; i++)
    {
        arr[i] = number % 10;
        number /= 10;
    }
    //将转化的倒叙数组,变为正常的数组
    for (int start = 0, end = n - 1; start < end; start++, end--)
    {
        int temp = arr[start];
        arr[start] = arr[end];
        arr[end] = temp;
    }
}
2. 将int arr[n] 拆分为n-s+1个newArr[n-s];
        int m = 0, v = 0;
        while (m < n)
        {
            if (m < i || m > j)
            {
                newArr[v] = arr[m];
                v++;
            }
            m++;
        }
3. 将拆分后的n-s+1个newArr[n-s]聚合为 numArr[n-s+1];
int parseInt(int arr[], int len)
{
    int total = 0;
    for (int i = 0; i < len; i++)
    {
        int num = arr[i];
        total += calcutateWeightNum(num, len - (i + 1));
    }
    return total;
}
/**
 * 计算位数
 */
int calcutateWeightNum(int num, int numOfTen)
{
    int result = num;
    for (int i = 0; numOfTen > 0 && i < numOfTen; i++)
        result *= 10;
    return result;
}
4. 求出numArr[n-s+1]中的最大元素
int maxNumArr(int numArr[], int n)
{
    int temp = numArr[0];
    for (int i = 0; i < n; i++)
        if (i > temp)
            temp = i;
    return temp;
}

完整代码为:

/*
 * @Filename: new_positive_interger
 * @Author: wyz
 * @Email: 2011038216@qq.com
 * @Date: 2021-11-23 14:29:44
 * @LastEditors: wyz
 * @LastEditTime: 2021-11-23 14:48:55
 */
#include <iostream>
#include <cmath>
using namespace std;

int arr[100];

void arrForInt(int number);
int parseInt(int arr[], int len);
int calcutateWeightNum(int num, int numOfTen);
int maxNumArr(int numArr[], int n);

int main()
{
    int number;
    cout << "Input a number:" << endl;
    cin >> number;
    int s;
    cout << "Input the s:" << endl;
    cin >> s;

    int n = int(log10(number) + 1);

    arrForInt(number);

    int newArr[n - s], numArr[n - s + 1];
    //将int arr[n] 拆分成 n-s+1个newArr[n-s]
    for (int i = 0, j = s - 1; i < n - s + 1; i++, j++)
    {
        int m = 0, v = 0;
        while (m < n)
        {
            if (m < i || m > j)
            {
                newArr[v] = arr[m];
                v++;
            }
            m++;
        }
        numArr[i] = parseInt(newArr, n - s);
    }
    cout << "the del " << s << " to max number is " << maxNumArr(numArr, n - s + 1) << endl;
    return 0;
}
/**
 * 将整数转化为整数数组
 */
void arrForInt(int number)
{
    int n = int(log10(number) + 1);
    for (int i = 0; i < n; i++)
    {
        arr[i] = number % 10;
        number /= 10;
    }
    //将转化的倒叙数组,变为正常的数组
    for (int start = 0, end = n - 1; start < end; start++, end--)
    {
        int temp = arr[start];
        arr[start] = arr[end];
        arr[end] = temp;
    }
}
/**
 * 将拆分的n-s+1个newArr[n-s]聚合为numArr
 */
int parseInt(int arr[], int len)
{
    int total = 0;
    for (int i = 0; i < len; i++)
    {
        int num = arr[i];
        total += calcutateWeightNum(num, len - (i + 1));
    }
    return total;
}
/**
 * 计算位数
 */
int calcutateWeightNum(int num, int numOfTen)
{
    int result = num;
    for (int i = 0; numOfTen > 0 && i < numOfTen; i++)
        result *= 10;
    return result;
}
/**
 * 得到最大值
 */
int maxNumArr(int numArr[], int n)
{
    int temp = numArr[0];
    for (int i = 0; i < n; i++)
        if (i > temp)
            temp = i;
    return temp;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌白羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值