1541:失われたかっこ
これは何の問題ですか。
これは適当に括弧を付けて、与えられた式の最大値を求める問題である.
もしもし。
私が考えている医徳は以下の通りです.Declare N = [], O = [], S = 0, i = 0. sub = false
Get S
while S[i] != '\0':
if S[i] == '+' or S[i] == '-':
partition S from i to j as a number n.
j = i+1
append number n to N.
append S[i] to O.
S = N[0]
For i=0 to (length of O):
if O[i] == '-':
sub = !sub;
if sub:
S -= N[i+1]
else:
S += N[i+1]
print S
Declare N = [], O = [], S = 0, i = 0. sub = false
Get S
while S[i] != '\0':
if S[i] == '+' or S[i] == '-':
partition S from i to j as a number n.
j = i+1
append number n to N.
append S[i] to O.
S = N[0]
For i=0 to (length of O):
if O[i] == '-':
sub = !sub;
if sub:
S -= N[i+1]
else:
S += N[i+1]
print S
めまいがする
これは私が最終的に完成したコードです.#include <stdio.h>
#include <stdlib.h>
int p(char* s, int st, int en) {
int i=0, m=0, r;
char* ss = (char*)calloc(en-st, sizeof(char));
for(i=st;i<en;i++)
ss[m++] = s[i];
r = atoi(ss);
free(ss);
return r;
}
int main() {
char S[51]={0}, O[24]={0};
int N[25]={0}, sub=0, s=0, i=0, j=0, k=0, l=0;
scanf("%s", S);
while(S[i]!=0) {
if(S[i]=='+' || S[i]=='-') {
N[k++] = p(S, j, i);
O[l++] = S[i];
j = i+1;
}
i++;
}
N[k++] = p(S, j, i);
s = N[0];
for(i=0;i<l;i++) {
if(O[i]=='-') {
sub = 1;
s -= N[i+1];
} else if(O[i] == '+') {
if(sub) s -= N[i+1];
else s += N[i+1];
}
}
printf("%d", s);
}
汚いだけです.まだいくつかの試行錯誤がある.
#include <stdio.h>
#include <stdlib.h>
int p(char* s, int st, int en) {
int i=0, m=0, r;
char* ss = (char*)calloc(en-st, sizeof(char));
for(i=st;i<en;i++)
ss[m++] = s[i];
r = atoi(ss);
free(ss);
return r;
}
int main() {
char S[51]={0}, O[24]={0};
int N[25]={0}, sub=0, s=0, i=0, j=0, k=0, l=0;
scanf("%s", S);
while(S[i]!=0) {
if(S[i]=='+' || S[i]=='-') {
N[k++] = p(S, j, i);
O[l++] = S[i];
j = i+1;
}
i++;
}
N[k++] = p(S, j, i);
s = N[0];
for(i=0;i<l;i++) {
if(O[i]=='-') {
sub = 1;
s -= N[i+1];
} else if(O[i] == '+') {
if(sub) s -= N[i+1];
else s += N[i+1];
}
}
printf("%d", s);
}
1-3-5-2-3 = ?
->subの状態が異なり、+または-の働き方も異なり、開始時-出現するたびにsub値が切り替わり、subが本物であれば削除し、偽物であればさらに誤ります.
1-3+5-2+3 = ?
-> 1.訂正した間違いですが、今回はsubが本物で、+出た時にマイナス記号が付けられていなかったので間違いました.
malloc v. calloc
->これは意外な伏兵なので、文字列と数字列の関数の結果値がおかしいです.例えば、50+1は50+10に等しい.結論は連続したデータを表現するにはcallocと書きます.
他の人はどうやってやったの? #include <stdio.h>
#include <stdlib.h>
int main()
{
int n, result = 0;
char c;
while(scanf("%d", &n) == 1){
result += n;
c = getchar();
if(c == '-')
break;
}
while(scanf("%d", &n) == 1){
result -= n;
c = getchar();
}
printf("%d\n", result);
}
my 0421 krのソース
-> https://www.acmicpc.net/source/17238597
なんと簡潔なソースだろう.
私の愚かな頭で問題の本質を理解するのに長い時間がかかった.結果-記号が一度現れると、後ろの数字が全部消えてしまい、複雑すぎると思います.🤔
また、電話で受信する必要もありません.scanfの動作方式を考えれば、上記のように簡略化できると思いますが、当時はscanf("%d",&n)もNの中の数字ではなく、別のものを加えるのであれば、そうはいかないと思いました.だから和弦はそんなに長いです.
-> https://www.ibm.com/docs/ko/i/7.3?topic=functions-scanf-read-data
stdinの文字がformat-stringと衝突した場合、scanf()は終了します.衝突文字が読み込まれていない場合、stdinは左側にあります.
ははは….今になってやっとこれを知った.
に感銘を与える
なぜ2番銀の問題がこんなに難しいと思うのか、私の方法が少し難しいからかもしれないと思っています.問題を解くのも退屈だから気分が悪い
そしてmallocとcallocを使い分ける無知に書いたあげく、事故が起きた.
Reference
この問題について(1541:失われたかっこ), 我々は、より多くの情報をここで見つけました
https://velog.io/@qoo0302/1541-잃어버린-괄호
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, result = 0;
char c;
while(scanf("%d", &n) == 1){
result += n;
c = getchar();
if(c == '-')
break;
}
while(scanf("%d", &n) == 1){
result -= n;
c = getchar();
}
printf("%d\n", result);
}
なぜ2番銀の問題がこんなに難しいと思うのか、私の方法が少し難しいからかもしれないと思っています.問題を解くのも退屈だから気分が悪い
そしてmallocとcallocを使い分ける無知に書いたあげく、事故が起きた.
Reference
この問題について(1541:失われたかっこ), 我々は、より多くの情報をここで見つけました https://velog.io/@qoo0302/1541-잃어버린-괄호テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol