質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

899閲覧

記載の問題に対して書いたプログラムに出たエラーが自己解決できませんでした

AKIRA

総合スコア1

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2022/03/19 02:48

問題文
整数 X を十進法で表したときの各桁の数字の和を f(X) としたとき、X が f(X) で割り切れる場合、X はハーシャッド数である。
整数 N が与えられるので、ハーシャッド数かどうか判定せよ。

制約
1≦N≦10^8
入力は全て整数
/////////////////////////////////////////////////////////////////
上記の問題において、

int型で整数入力を受け取り、string型のSに変換、Sの要素をひとつづつ調べてf(x)を求める、という方針を立て、

#include <bits/stdc++.h>
using namespace std;

int main() {
int N, x = 0;
string S;

cin >> N;

S = to_string(N);

for(int i = 0;i < sizeof(S);i++){
for(int j = 0;j < 10;j++){
if(S[i] == j){
x += j;
}
}
}

if(N % x == 0){
cout << "Yes" << endl;
}
else{
cout << "No" << endl;
}

}

というプログラムを書きました。

結果として、実行時エラーとして

./Main.cpp: In function ‘int main()’:
./Main.cpp:12:19: warning: comparison of integer expressions of different signedness: ‘int’ and ‘long unsigned int’ [-Wsign-compare]
12 | for(int i = 0;i < sizeof(S);i++){
| ~~^~~~~~~~~~~

となってしまいました。

調べたところ、「符号の異なる整数式の比較をしている」と分かったのですが、iと配列の大きさを比べる式において、0≦iとしているのにこのエラーになってしまった原因がわかりませんでした。

また、そもそもこの問題に対してこのプログラムではできない、このプログラムでは間違っているという場合は改善点などを教えていただけるとありがたいです。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2022/03/19 03:06

> 実行時エラーとして これは「コンパイル時」の「ワーニング」です。実行時エラーではありません。
guest

回答2

0

んで、それはエラーではありません。
ワーニングですよ

投稿2022/03/19 03:29

y_waiwai

総合スコア87836

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AKIRA

2022/03/19 05:06

実行時エラーみたいな文言が出てきたためエラーかと思ってしまっていました。 回答ありがとうございます!
episteme

2022/03/19 06:33

> ./Main.cpp:12:19: warning: comparison of integer expressions... "warning"って書いてある。
guest

0

ベストアンサー

sizeof(S) は文字列Sの長さを返しません

※ C++っぽく書いてみた

C++

1#include <iostream> 2#include <string> 3#include <numeric> 4using namespace std; 5 6int main() { 7 int N; 8 cin >> N; 9 10 string S = to_string(N); 11 int x = transform_reduce(S.begin(), S.end(), 0, 12 [](int x, int y) -> int { return x+y; }, 13 [](char c) -> int { return c-'0'; }); 14 cout << ((N % x == 0) ? "Yes" : "No") << endl; 15 16}

投稿2022/03/19 03:07

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AKIRA

2022/03/19 04:36

size ofは文字列の長さを返さないんですね! プログラムまでご丁寧にありがとうございます! 早速やり直してみたいと思います。 回答ありがとうございした!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問