- 締切済み
C言語の問題です。
以下のプログラムはどうなりますか? ----------------------------------------------------------------------------- 整数xを入力すると,A√B の形に変形するプログラムを作成.ただし,xが負の場合 A√B i と虚数を表示すること. また,√1 の場合はルート部は表示せず,また整数部が1の場合も同様に表示しない. -----------------------------------------------------------------------------
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- akayoroshi
- ベストアンサー率50% (46/91)
この問題には素数は必要ないでしょう xが正数のときの処理手順です。(int型の値の最大値を2,147,483,648(=2の31乗から1引いた数)としてxもそれ以下ということにします。〉int型で表現できる最大の平方数は46,340の2乗で2,147,365,900です。 作業用の変数kを用意して値を46,340としておきます。 以下の2行を繰り返します。 xがk*kで割り切れたときは繰り返しから抜け出します。(kが0になる前に必ず抜け出します。) 割り切れなかったときはkを1減らします。 繰り返しが終わったときのkを使ってA=k, B=x/(k*k)とします。 int k=46360; for ( ; ; k--) if ( x%(k*k)==0 ) break; A=k; B=x/(k*k); ここで46,360のような環境依存の数値を使わないで、たとえば、あらかじめk*k≦xであるようなkを探しておいてそこから始めるほうが効率がよさそうですが、xが表現できる最大の平方数より大きかったりすると、kを探すときにオーバーフローがおきたりしてその対処はかなり面倒なことになります。
- tetometo
- ベストアンサー率50% (4/8)
面白そうな問題ですね。数学音痴な僕が挑戦してみますw √25が5だから、Bの部分は素数が来るんですね.それで、素数で割れば、Aが求まるんでしたっけ。でも、素数って、スーパーコンピュータで解析中じゃなかったでしたっけ。違いましたっけ。素数を最初にどこまでか決めなかったら、無理じゃないですかね。 int mPrime[10] = {2, 3, 5, 7, 11}; int getA(int x, int b) { int i、res; if (b == 0) b = 2; for (i = 1; i < PRIME_MAX; i++) { if (mPrime[i] * mPrime[i] < x && b != i) res = mPrime[i]; return res; } int getB(int x, int a) { int i = 1; int n = a * a; int res; while (1) { res = n * i; i++; if (res >= x) a = getA(x); } } void show(int a, int b) { printf("%d√%d\n", a, b); } いやー、難しいっすね。降参。
- hashioogi
- ベストアンサー率25% (102/404)
まず素因数分解をC言語で実現しましょう。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> 整数xを入力すると,A√B の形に変形する x を A√B の形にするのなら A = x B = 1
- Tacosan
- ベストアンサー率23% (3656/15482)
「きちんと」ってのは, 「その通りにやれば誰でもできる」ことを意味します (コンピュータはせいぜい「言われたこと」しかしない). その方法で √171 をどう処理するのですか?
- Tacosan
- ベストアンサー率23% (3656/15482)
多分だけど, 「プログラムを作る」ところまでいってないんじゃないの? この問題を, (プログラムじゃなくって) 自分の頭で処理するとしたらどのようにするか, きちんと言葉で書けますか?
- Tacosan
- ベストアンサー率23% (3656/15482)
自分で考えようという気はないのですか?
補足
入力、if文で場合分け、までは習ったのでわかったのですが、それ以外がわかりません。教えていただけたら嬉しいです。
補足
xをおく→xに値をいれる→{xが正の場合の変形}{xが負の場合の変形(虚数がつく)}{xが累乗の場合の変形(√表示しない)}{xが累乗ではない場合の変形(整数部を表示しない)}→値を返す 習いたてでろくに知ろうともせずに質問をしていた節があります。まだ時間はあるのでしっかり勉強してきます。