• ベストアンサー

C言語のIF関数のアドバイスお願いします。

#include <stdio.h> int main(){ int x,i,div=0; printf("x="); scanf("%d",&x); for(i=1;i<=x;i++){ if(x%i == 0){ div++; } } if(ここがわかりません) printf("%dは素数です\n",x); else printf("%dは素数でありません\n",x); return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.1

C言語のIFは、関数ではなく、ステートメントです。 >if(ここがわかりません) 素数とは何ですか? 「1と、その数自身ででしか、割り切れない数」です。 1は、1と1ででしか割り切れませんから、素数です。質問のプログラムでは if(x%i == 0){ div++; } が実行されるのは1回だけなので、divが1になります。 2は、1と2ででしか割り切れませんから、素数です。質問のプログラムでは if(x%i == 0){ div++; } が実行されるのは2回だけなので、divが2になります。 4は、1と2と4で割り切れますから、素数ではありません。質問のプログラムでは if(x%i == 0){ div++; } が実行されるのは3回あるので、divが3になります。 5は、1と5ででしか割り切れませんから、素数です。質問のプログラムでは if(x%i == 0){ div++; } が実行されるのは2回だけなので、divが2になります。 6は、1と2と3と6で割り切れますから、素数ではありません。質問のプログラムでは if(x%i == 0){ div++; } が実行されるのは4回あるので、divが4になります。 これ以上は説明しなくても判りますね? 「divがどういう値になっていると素数なのか?」も判りますね? あとは、その条件式をif文に書くだけです。

issyunnnoyume
質問者

お礼

具体的でわかりやすくやすかったです。ありがとうございました!!。

その他の回答 (4)

  • FAY
  • ベストアンサー率49% (95/193)
回答No.5

これも蛇足なんですが・・・ 素数判定で自分自身までループする必要はありません。 x の 平方根の整数部の値まで回せば十分です。

  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.4

追記。 「1」は素数ではないので、divが1になってしまった時は「素数じゃない」と判定しなければいけませんでした。訂正します。 あと、蛇足ですが、 >for(i=1;i<=x;i++){ でループを回してdivをカウントアップする方法は「非常に良く出来ている」と言えます。 なぜなら、負数や0や1を入力した時に「素数を入力した時と異なる結果になる」からです。 他の回答で >素数は、1と自分自身では割り切れることが分かっているので、最初のfor文は、 >for( i=2; i<x; i++) { >でも良いかも知れません。 とありますが、これは「逆に複雑にしてしまう」ので駄目です。 やってみれば判りますが for( i=2; i<x; i++) { でループさせると、素数じゃない負数、0、1を入力した時と、素数の2、3、5、7を入力した時で、結果(divの値)が同じになってしまいます。 このループに変えてしまうと、素数じゃない負数、0、1を入力した時に、別個に判定が必要になり、逆に複雑になります。 オリジナルの for(i=1;i<=x;i++){ でループさせた場合、素数じゃない負数や0を入力するとdivが0に、素数じゃない1を入力するとdivが1に、素数の2、3、5、7を入力するとdivが2に、素数じゃない4や6を入力するとdivが3以上になります。 なので「divが2になったかどうか?」だけを判断すれば、素数じゃない負数や0や1も「素数じゃない」と判定され、負数や0や1を個別に判定する必要が無くなります。 そのため「1から自分自身までループを回す」と言うのが「非常に重要」になります。 そういう訳で「1から自分自身も含めてループするのは、非常に良く出来ている」と言えます。

回答No.3

1は素数ではないのでは? 「1より大きい整数で...」と定義されているはずです。 約数が2つの正の整数と考えれば、わかりやすいでしょう。1の約数は1つだけです。

  • KEIS050162
  • ベストアンサー率47% (890/1879)
回答No.2

既に回答が出ているので蛇足的ですが、 その1: 素数は、1と自分自身では割り切れることが分かっているので、最初のfor文は、 for( i=2; i<x; i++) { でも良いかも知れません。(但し、この場合、入力は1以下は受け付けない様にしないとなりませんが) こうすると後半のif文の条件はとてもシンプルになるはずです。 その2: 後半のif文の条件は、既に解説のある通りですが、試しに、print文でdivと入力したxを表示させてみて、色々な数値を入れてみれば、一発で理解出来ると思いますよ。 ご参考に。

関連するQ&A

  • C言語について

    次のような問題です。 問 自然数nを入力し、nを3で割って割り切れるかどうかを判定し結果を表示する。「割り切れる」、「1余る」、「「2余る」のいずれかが入るものとする。 このようなものをつくりました。 #include<stdio.h> int main(void) { int n; printf("自然数:"); scanf("%d",&n); if(n==0){ printf("割り切れる\n"); }else if(n==1){ printf("1余る\n"); }else{ printf("2余る"); } return(0); } これで合っているかよろしくお願いします。

  • c言語についての質問です。

    #include<stdio.h> int main(void){ int a; printf("1文字たいぷしてください。\n"); scanf("%d",&a); if(a>=65 && a<=90){ printf("大文字です。\n"); } else if(a>=97 && a<=122){ printf("小文字です。\n"); } else{ printf("大文字でも小文字でもありません\n"); } return 0; } このプログラムは正しくなくて、 intをchar %dを%cにかえなければなりません。 なぜintはダメなんでしょうか? できれば丁寧に教えてください。 お願いします。

  • C言語で分からないところがあるのですが……

    C言語で分からないところがあるのですが…… すみません。C言語の課題で分からないところがあり、質問しに来ました。 ユーザから数を受けて、そこまでのフィボナッチ数列を表示させるというプログラムです。 下のソースコード(でいいんですよね?)は正しいやつです。 for文を使って、繰り返しの作業を行うことに成功しましたが、doとwhileに書き換える作業がうまくできません。 どなたか助けてください。 #include<stdio.h> fib(int n) { if(n == 1)return(1); else{ if(n == 2) return (1); else return fib(n-1) + fib(n-2); } } main() { int n, i ; printf("INPUT the number. : "); scanf("%d",&n); for(i=1; i<=n; i++){ printf("F%d = %d\n",i, fib(i)); } }

  • C言語の問題がわからないです。

    C言語のプログラムで、列数を自分で決めて、 (例)3列         ●(この行を最後として)   □● ●□● 上記のプログラムを作りたいのですが、 上手くいきません。途中まで作ったのですが、なかなか思うようにいかないです。どうすれば上記のようになりますでしょうか? #include <stdio.h> void disp(int x, int y); main() { int i,n; printf("表示する列:"); scanf("%d",&n); disp(3,3); for(i=1;i<=n;i++){ if(i%2==0){ disp(n-i,4); disp(i,2); } else{ disp(n-i,4); disp(i,1); } disp(1,3); } } void disp(int x, int y) { int i; for(i=0;i<x;i++){ if(y==1){ printf("●"); } else if(y==2){ printf("□"); } else if(y==3){ printf("\n"); } else{ printf("\0"); } } }

  • 私はC言語を習い始めて5日の初心者です。

    私はC言語を習い始めて5日の初心者です。 下記のプログラムが動かないので優しく教えてください。 どうかお願いします。 #include <stdio.h> int main() { int ans1,ans; int total printf("コンビニ行くときは(1:車で 2:自転車で 3:歩いて)行く\n"); scanf("%d",&ans1); printf("1:汗かいた記憶がない 2:たまに汗かく 3:よく汗をかく\n"); scanf("%d",&ans2); total=ans1+ans2; if (total<4) { printf("運動不足です\n"); }else { printf("良く運動していますね\n"); } return(0); }

  • C言語で数当てゲーム

    私は最近5月からCのプログラミングを学び始めた中3なんですが じゃんけんゲームと丁半ゲームを今までに作りました で今回数当てゲームを作ってみたのですが何回作り直しても エラーが出ます(コンパイラのエラーではなくWindows?のエラーのようなもの) じゃんけんゲームなどと同じように作ったつもりなのですが・・・・ どうなっているのでしょうか? ソースは↓です #include <stdio.h> #include <time.h> #include <stdlib.h> #include <conio.h> int main() { int kazu,i,x; printf("数当てゲーム!!\n"); srand(time(NULL)); x=0; i=0; do { kazu=rand()%9+1; printf("数を入力してください(1~9)\n"); scanf("%d",i); if(i<10){ if(i==kazu) { printf("当たり!!\n続けるなら0やめるなら0以外を入力"); scanf("%d",x); } else {printf("残念・・・はずれ\n続けるなら0やめるなら0以外を入力"); scanf("%d",x);} } else {printf("入力ミスです\n続けるなら0やめるなら0以外を入力"); getch();} }while(x==0); return 0; } 一応コンパイラのエラーは出ていないのですが・・・ 初心者なのでわかりません。 どこが原因なのか詳しくおしえてください

  • c言語のフローチャートについての質問です

    #include <stdio.h> int main (void) { int n; for (n=1900; n<2000; n++) { if (n%4==0 && n%100!=10) printf ("%d",n); else if(n%400==0) printf ("%d",n); } printf("\n"); return 0; } をどなたかフローチャートに直してください JIS規格のものでお願いします

  • c++

    /* char03*/ #include<stdio.h> int main() { char i; for(i='!';i<='~';i++){ printf(%3d(0x%2X)--%c",i,i,i); if((1-'!'+1)%4==0 printf("\n") } printf("\n") return("\n") return 0; } if((1-'!'+1)%4==0はどういう意味でしょうか

  • C言語 if文について

    #include <stdio.h> int main(void) { int a; printf("整数を入力してください:"); scanf("%d",&a); if(a % 10 == 5) puts("最下位の桁は5です。"); else puts("最下位の桁は5でありません。"); return 0; これでどうして読み込んだ整数値の最も下の桁が5であるかどうかを判断しているのでしょう? ifの式がいまいち理解できません。 解説できる方いませんか?

  • C言語の質問です。

    #include"stdio.h" int main(void){ int a, b, add; scanf_s("%d%d", &a, &b); add = a+b; printf("add=%d\n", add); return 0; } と、------------------------------------------------------------------------------ #include"stdio.h" int tasizan(int x, int y); int main(void){ int a, b, add; scanf_s("%d%d", &a, &b); add = tasizan(a, b); printf("add=%d\n", add); return 0; } int tasizan(int x, int y){ int aa; aa = x + y; return aa; } の違いを教えてください。

専門家に質問してみよう