#include
int main(void)
{
int n = 5, k;
k = (++n) + (++n) + (n++);
printf("%d,%d\n", k, n);
return 0;
}
最后k的值为什么是21?
这个值是不确定的,不同的编译器结果都不同
因为这是C语言未定义行为
参考:https://www.cnblogs.com/jaydenhpj/p/4432677.html
在表达式 (++n) + (++n) + (n++) 中:
++n 表示先对 n 进行自增操作,再将自增后的结果再次赋值给 n,因此第一次计算时,n 的值变成了 6,同时 ++n 的值也变成了 6,即 ++n 表达式的值为 6。
进行第二次计算时,n 的值已经变成了 6,因此 ++n 的值为 7,表达式变为 6 + 7。
进行第三次计算时,n 的值变成了 7,但是此时之前的 ++n 表达式已经计算完成,因此这里使用的是 n++ 表达式的值,即 7,此时计算结果为 6 + 7 + 7,结果为 20。
因为 n = 7,所以最终 k 的值为 20 + 7 = 21。所以程序输出 21,7。
输入:
12321
3
输出:
11
输入:
12
1
输出:
1
/**
* 思路:最长上升子序列的变种
* 每遍历到字符串中的字符,若存在比当前字符大的字符,则删除之
* 直到删除的个数已为k 或遍历到了 最后一个字符为止
*
*/
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int main() {
string num;
int k;
cin >> num >> k;
if(k == 0) {
cout << num;
return 0;
}
int len = num.length();
int finalLen = len - k;
if(finalLen <= 0) {
cout << "";
return 0;
}
int flag[len];
memset(flag,0,sizeof(flag));
int i = 1;
int j = 0;
// 有可能存在 12345 这种删除字符数目不够k 的情况
// 则将前 len - k 个 字符打印之
while(i < len && k > 0) {
int a = num[i] - '0';
for(int j = 0;j < i;j++) {
int b = num[j] - '0';
if(a < b && flag[j] == 0) {
flag[j] = 1;
k--;
if(k == 0) {
break;
}
}
}
i++;
}
for(int i = 0;i < len;i++) {
if(flag[i] == 0 && finalLen > 0) {
cout << num[i];
finalLen--;
}
}
return 0;
}