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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

209閲覧

メモリー割り当てを使った約数の求め方

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/05/30 20:30

c

1#include <stdio.h> 2#include <stdlib.h> 3 4int main(void) 5{ 6 int *data= 0; 7 int num,i; 8 9 printf("どの整数の約数を求めますか?:"); scanf("%d", &num); 10 11 data = (int *)malloc(sizeof(int)*num); 12 if(data == NULL){ 13 printf("メモリが確保出来ません\n"); 14 return 1; 15 } 16 17 printf("%dの約数:",num); 18 for (i = 0;i<=num;++i){ 19 if( num % i == 0 ) 20 printf("%d",i); 21 } 22 23 free(data); 24 return 0; 25}

やりたいこと

入力された数値の正の約数を全て求めて表示するプログラムのフローチャートとソースプログラムを作成 せよ。なお、約数データは一旦動的メモリ割り当てで確保された領域に保存した後で表示すること(メモリ は最初に入力された整数の分だけ確保すればよい)。
・1 未満の数は考えなくて良い ・約数かどうかは、入力された数をその数で割った際に割り切れるかどうか判断する
・入力された数を 1 から順に割っていけばよい
・実行例の場合:「2」を入力したときは int 型で 2 個分、「30」を入力したときは int 型で 30 個分を最初に 確保すればよい

困っていること

そもそもメモリーの使い方が間違っているかもしれませんが、実行して入力して約数を求める時に落ちてしまいます。

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

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

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

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

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

guest

回答2

0

c

1 for (i = 0;i<=num;++i){ 2 if( num % i == 0 ) 3 printf("%d",i); 4 }

ここで i == 0 のときに num % inum % 0 となり、エラーが発生します。
ループ条件を「0以上num以下」ではなく「1以上num以下」に修正すれば動きます。

投稿2018/05/30 21:26

set0gut1

総合スコア2413

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

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

退会済みユーザー

退会済みユーザー

2018/05/30 21:36

ありがとうございます。動きました。 一つお聞きしたいのですが、コードは動きましたがメモリーは使われているのでしょうか?
set0gut1

2018/05/30 21:41

確保したメモリ領域は現コードでは使われてないです。 出題の要求を満たすためには「わざわざ data[x] に約数を入れる」っていう処理が要ります。
guest

0

ベストアンサー

たぶん問題はこういう意味でしょう。
Nの約数を求めるときは、N要素の配列を求める。
IがNの約数の時には、配列のI個めにしるしをつける。
2-Nまでの数がNの約数であるか調べ終わったら、しるしが付いたところだけを表示する。

で、何が面白いか というと、
1.IがNの約数の時に、N/IもNの約数になる。
2.IがNの約数の時に、Iの約数もNの約数になる。
3.IがNの約数ではないときに、I*J( Jも整数)はNの約数にはならない。

そうは書いても、この小さな欄にそういったことを表現するのは面倒なので、力業だけで書くと..

#include <stdio.h> #include <stdlib.h> int main(int argc,char **argv) { char *m ; int i,n ; scanf("%d",&n) ; if( (m=(char *)malloc(sizeof(char)*(n+1)))==NULL ) return -1 ; m[0] = m[1] = m[n] = 0 ; for( i=2 ; i<n ; i++ ) m[i]= n%i ; for( i=1 ; i<=n ; i++ ) if(!m[i]) printf("%3d\n",i); return 0 ; }

投稿2018/06/01 14:10

gm300

総合スコア580

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問