救命,第一此做题就难住了。这是 7.24 每日一练的题目,自己试着写了很久,感觉没有错,但一直通过不了,自己能想到的例子都试过了没问题。请大家帮忙看一下,写的代码不太规范,还请见谅
题目描述:
给定任意一个数字 m,然后给出数字 n,则需在 m 中去掉 n 位数,保持各位顺序不变的情况下,得到最大数。
输入描述:
输入整数n,m.(1<=n<=1e100,1<=m<=100)
输出描述:
输出删除后的最大数。
**示例 **
输入:1234 2
输出:34
void solution(int arr[2])
{
int i=0;
int b[10];
while(arr[0]%10)
{
b[i]=arr[0]%10;
i++;
arr[0]=arr[0]/10;
}
i--;
int temp = i;
int max = 0;
int flag = 0;
int sum = 0;
int n=i;
while(flag<i+1 - arr[1] && i>0)
{
for(int j=temp;j>=i-arr[1]-flag;j--)
{
if(j == i){
if(b[j]>max && j<=temp )
{
max = b[j];
temp = j-1;
n=j;
}
}
else{
if(b[j]>max && j<=temp )
{
max = b[j];
temp = j;
if(j==n)max=0;
n=j;
}
}
}
sum = sum*10+max;
max=0;
flag++;
}
printf("%d",sum);
}
int main() {
int arr[2];
for (int i = 0; i < 2; i++)
{
scanf("%d", &arr[i]);
}
solution(arr);
return 0;
}
#include <stdio.h>
int solution(int arr[])
{
int a[10];
int num = arr[0];
int n = 0;
while (num > 0)
{
a[n++] = num % 10;
num /= 10;
}
for (int i = 0; i < arr[1]; i++)
{
int min = 0;
for (int j = 0; j < n - i; j++)
{
if (a[j] < a[min]) min = j;
}
for (int j = min; j < n - i - 1; j++)
{
a[j] = a[j + 1];
}
}
int sum = 0;
for (int i = n - arr[1] - 1; i >= 0; i--)
{
sum *= 10;
sum += a[i];
}
return sum;
}
int main() {
int arr[2];
for (int i = 0; i < 2; i++)
{
scanf("%d", &arr[i]);
}
int sum = solution(arr);
printf("%d",sum);
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:这里我们采用质数筛法(sieve method)的方式。与之前的对每一个数字依次判断是否为质数的方式不同,筛法的思想是“标记出所有非质数,输出所有没被标记的数字”。这里以“输出15以内大于1的所有质数”为例,示例代码如下:
#include <stdio.h>
int main() {
int n = 15;
int mark[16] = {
1, 1, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0
};
int c;
int j;
for (c = 2; c * c <= n; c++) {
if (mark[c] != 1) {
for (j = 2; j <= n / c; j++) {
mark[c * j] = 1;
}
}
}
for (c = 2; c <= n; c++) {
if (mark[c] != 1) {
printf("%d\n", c);
}
}
return 0;
}
这里采用此筛法,并使用string.h中的memset函数设置数组内的元素。本题代码如下:
#include <stdio.h>
#include <string.h>
int n = 1000000;
int mark[1000001];
int main() {
int c;
int i, j;
int N;
int M;
scanf("%d%d", &N, &M);
memset(mark, 0, sizeof(mark));
mark[0] = 1;
mark[1] = 1;
for (c = 2; c * c <= n; c++) {
if (mark[c] != 1) {
for (i = 2; i <= N / c; i++) {
mark[c * i] = 1;
}
}
}
for (j = M; j <= N; j++) {
if (mark[j] != 1) {
printf("%d\n",j);
}
}
return 0;
}
问题解答:
根据题目描述,我们需要从一个给定数字m中去掉n位数,并保持各位顺序不变,得到最大的数。
解决这个问题的思路如下: 1. 将输入的整数m转换为字符串形式,方便进行删除操作。 2. 创建一个空字符串res,用于存储最终的结果。 3. 初始化一个变量count为n,表示还需要删除的位数。 4. 从左到右遍历字符串m的每一位: - 如果count>0且res不为空且当前位大于res的最后一位,则删除res的最后一位,并将count减1。 - 将当前位添加到res的末尾。 5. 如果count仍然大于0,则从res的末尾删除count个字符。 6. 将res转换为整数,并返回结果。
下面是具体的代码实现:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int m, n;
// 输入数据
printf("请输入m和n:");
scanf("%d %d", &m, &n);
// 将m转换为字符串
char str[101];
sprintf(str, "%d", m);
// 删除n位数
int count = n;
char res[101] = "";
for (int i = 0; i < strlen(str); i++) {
while (count > 0 && strlen(res) > 0 && str[i] > res[strlen(res) - 1]) {
// 删除res的最后一位
res[strlen(res) - 1] = '\0';
count--;
}
// 将当前位添加到res的末尾
char digit[2] = {str[i], '\0'};
strcat(res, digit);
}
// 如果count仍然大于0,则从res的末尾删除count个字符
while (count > 0 && strlen(res) > 0) {
res[strlen(res) - 1] = '\0';
count--;
}
// 输出最大的数
int result = atoi(res);
printf("输出:%d", result);
return 0;
}
这样,我们可以通过输入m和n来得到删除数字后的最大数。请注意,输入的m和n的范围必须满足1<=m<=100和1<=n<=1e100,否则可能导致程序出错。
输入整数n,1<=n<=1e100 ,用 int 类型不够吧。