一个正整数删除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;
}