質問するログイン新規登録

回答編集履歴

1

条件抜けてたので修正

2020/08/19 12:44

投稿

thkana
thkana

スコア7738

answer CHANGED
@@ -1,22 +1,30 @@
1
1
  `#include <limits.h>`
2
2
  とすると、シンボル INT_MAX, INT_MINが使えるようになります。それぞれintの最大値、最小値です。
3
- 値をして桁あふれが発生してしまうと最大値以下の値になってしまうので、
3
+ 値を操作して桁あふれが発生してしまうと最大値以下の値(あるいは最小値より大きい値)になってしまうので、
4
- 一桁の値をす前に、しても大丈夫なのかどうか」という形で検査を行う必要があります。
4
+ 「値を何かしら操作前に、操作しても大丈夫なのかどうか」という形で検査を行う必要があります。
5
5
  ```C
6
+ if(INT_MAX/10 >= seisuu){
7
+ //10倍しても最大値を超えない
6
- seisuu *= 10;
8
+ seisuu *= 10;
9
+ }else{
10
+ //最大値を超える
11
+ seisuu = 0;
12
+ break;
13
+ }
7
- if(INT_MAX - seisuu > suuji[i]-'0'){
14
+ if (INT_MAX - seisuu >= suuji[i] - '0') {
8
- //足しても最大値を超えない
15
+ //足しても最大値を超えない
9
- seisuu+=suuji[i]-'0';
16
+ seisuu += suuji[i] - '0';
10
- }else{
17
+ } else {
11
- //最大値を超える
18
+ //最大値を超える
12
- seisuu=0;
19
+ seisuu = 0;
13
- break;
20
+ break;
14
- }
21
+ }
15
22
  ```
16
23
 
17
24
  > 下のプログラムでダメな部分
18
25
 
19
26
  いうまでもなく、負数に対応していないところ。
27
+ 「整数型の最小値よりも小さな値」を問題にするということは当然負の数も対象ですね?
20
28
 
21
29
  `while(scanf("%s", s) == 1){`
22
30
  ではループから脱出できないのでは。