小米oj
移除k位最小
描述
有一行由 N 個數字組成的數字字符串,字符串所表示的數是一正整數。移除字符串中的 K 個數字,使剩下的數字是所有可能中最小的。
假設:
字符串的長度一定大於等於 K
字符串不會以 0 開頭
輸入
一行由 N 個數字組成的數字字符串(0 < N < 20),和一個正整數 K(K < N),兩個數據由空格隔開,如:1432219 3。
輸出
移除 K 位後可能的最小的數字字符串。 如 1432219 移除 4, 3, 2 這 3 個數字後得到 1219,爲所有可能中的最小值。
這個題相對來說比較簡單。。。。。。。。。。先是讀出來然後。。。。。從最高位開始,針對每一個位做一個判斷,看這個位能不能被刪除,如果可以就刪並且更新剩餘可以刪除的位數(程序中用a來表示這個參數)
最後再把輸出字符前面的0都給刪掉就好了。。。。。。。。。。。。。。。。。。。。。。。。這個地方有個坑。。。所有數字都是0剩下的也是0不能全刪掉,最後還要輸出0.。。。。。
比如1234567890 0這種組合。。。
#pragma warning(disable:4996)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
#include <ctype.h>
int main()
{
char str1[20],spark[20];
static int a,len,leave,i,j,k,flag,gggg;//零時中轉
char line[1000];
scanf("%s %d",str1,&a);//a爲
//printf("%s\n", str1);
len = strlen(str1);
for (i = 0; i <=len; i++)
{
flag = 0;
for (j = 1; j < a+1; j++)//a位前位向後看
{
if (str1[i] > str1[i + j])
flag = 1;
}
if (flag == 1)
{
str1[i] = '0';
a--;
}
//printf("%d\n", a);
else
spark[k++] = str1[i];
}
len = strlen(spark);
int count = 0;
for (i = 0; i < len; i++)
{
if (spark[i] == '0')
count++;
}
if (count == len)
{
printf("0");
return 0;
}
for (i = 0; i < len; i++)
{
if (spark[i] == '0')
// gggg = 1;
;
else gggg = 2;
if (gggg == 2)
printf("%c",spark[i]);
}
//printf("%d\n", a);
//printf("%s\n", str1);
system("pause");
return 0;
}
這裏的#pragma warning(disable:4996)可以屏蔽掉vs 使用scanf_s的規則。。。。。。。然後system(“pause”)可以讓程序執行完後看結果。。方便調試。。。。。。。。。
。。。。
。
。
。
。
。
。
。
。
over.
.
.