プロが教えるわが家の防犯対策術!

半素数とは、その値が2つの素数の積で表される自然数である。たとえば、4(=2x2)、15(=3x5)は半素数である。 2〜20 の範囲の1つの自然数 n の値を入力すると、2x2 から nxn までの積の値を各行・各列に並べた掛け算九九(のような)表を出力するプログラムを作成しなさい。ただし、積の値が半素数である場合は、積の値の代わりに1つの #(半角シャープ)文字を出力し、それぞれの積(あるいは # 文字)は4文字幅右寄せで表示する。 また、n の値として指定された範囲以外の値が入力されると、プログラムは何も出力せずに終了するものとする。

C言語で上のようなプログラムを考えているのですが、中々上手くいきません。

コードの例など教えて欲しいです

A 回答 (2件)

#include <stdio.h>


#include <stdlib.h>
#include <stdbool.h>

int primes[] = {2, 3, 5, 7, 11, 13, 17, 19};

bool is_member(int n) {
 for (int i = 0; i < 8; i++) {
  if (primes[i] == n) {
   return true;
  }
 }
 return false;
}

int is_divisible(int n) {
 for (int i = 0; i < 8; i++) {
  if (n % primes[i] == 0)
   return n / primes[i];
 }
 return 0;
}

bool is_biprime(int n) {
 return is_member(is_divisible(n));
}


int main(void) {
 char s[3];
 int m, n;
 scanf("%2s%*[^\n]", s);
 getchar();
 n = strtol(s, NULL, 10);
 if ((n < 2) || (n > 20)) {
  goto end;
 }
 for (int i = 2; i <= n; i++) {
  for (int j = 2; j <= n; j++) {
   m = i * j;
   printf(is_biprime(m) ? " #" : "%4d", i * j);
  }
  puts("");
 }
 end:
 return EXIT_SUCCESS;
}
    • good
    • 0

まずは、普通の九九の表を作ってください。


九九の表は、二つの数字の積であるのは間違いないので、九九の表の二つの数字のいずれもが素数の場合に、掛け算の結果は半素数になります。
だから、九九の表を出力できるようになったら、「素数×素数」の場合だけ、# を出力するように変更すれば良いです。

あと、プログラム関係の質問では、「うまくいきません」というのは、お勧めできません。「ここでつまずいています」なら、別の回答があると思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!