プログラミングがわかりません

このQ&Aのポイント
  • 多倍長数を使った整数の乗算プログラムの作り方
  • 1から80までの階乗を計算し表示するプログラムの作り方
  • 多倍長数を使った整数の除算プログラムの作り方
回答を見る
  • ベストアンサー

プログラミングがわかりません

1.多倍長数で表現した整数aとint型で表現した整数xを乗算し、その結果をaに格納するプログラムを作れ。 #include<stdio.h> #define KETA 12 int main(void){ int a[KETA] = { 0, 0, 0, 1, 0, 2, 4, 6, 5, 5, 3, 6}; int x = 512; /*必要な変数があれば適宣宣言しなさい*/ /*多倍長数(c) <-- 多倍長数(a) * int型(x)*/ (ア) 出力省略 return 0; } 実行結果 a = 52462354432 2.多倍長数を用いて1から80までの各整数の階乗を計算し、正しい値を表示するプログラムを作れ。 注意 80の階乗を表現するためには、少なくとも119桁の整数を格納できる多倍長数を用いなければならない。 実行結果 1! = 1 2! = 2 3! = 6 ・・・ 3.多倍長数で表現した整数aとint型で表現した整数xで除算し、その結果をaに格納するプログラムを作れ。 aがxで割り切れない場合に生じるあまりは使用せずに捨ててもよい。 除算の途中で現れる整数はint型で表現できる範囲であることを仮定してもよい。 ソースコード #include<stdio.h> #define KETA 12 int main(void){ int a[KETA] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1}; int x = 365; /*必要な変数があれば適宣宣言しなさい*/ /*多倍長数(a) <-- 多倍長数(a) ÷ int型(x)*/ (ア) return 0; } 実行結果 a = 33823777 2はまったくわかりません 1,3の出力はわかるのですが、計算過程がわかりません 教えてくださいよろしくお願いします。

noname#254783
noname#254783

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

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8508/19344)
回答No.5

最後に2)に行く前に1)を訂正。 1)の if ((a[j] > 10) && (j)) { a[j]-=10; a[j-1]++; } を if (a[j] >= 10) { a[j] -= 10; n += 10; } に訂正。 で、最後に2)を。 #include<stdio.h> #define KETA 120 int main(void){ int a[KETA]; int x,y; int i,j,n; for (i = 0;i < KETA;i++) a[i] = 0; a[KETA-1]=1; for (x = 1;x <= 80;x++) { for (i = 0;i < KETA;i++) a[i] *= x; for (i = 0;i < KETA;i++) { n = a[i]; a[i]=0; j=i; while ((n) && (j >= 0)) { a[j] += n % 10; if (a[j] >= 10) { a[j] -= 10; n += 10; } j--; n /= 10; } } printf("%d! = ",x); for (i = 0;i < KETA;i++) if (a[i]) break; for (;i < KETA;i++) printf("%d",a[i]); printf("\n"); } return 0; }

その他の回答 (4)

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

次に3)を。 #include<stdio.h> #define KETA 12 int main(void){ int a[KETA] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1}; int x = 365; int b[KETA]; int i,j,y,n; for (i = 0;i < KETA;i++) b[i] = 0; for (i = 0;i < KETA;i++) { y=0; for (j = i;j < KETA;j++) { y *= 10; y += a[j]; a[j] = 0; if (y >= x) break; } b[j] = y / x; n = y % x; for (;j >= 0;j--) { a[j] += n % 10; n /= 10; } } for (i = 0;i < KETA;i++) a[i] = b[i]; printf("a = "); for (i = 0;i < KETA;i++) if (a[i]) break; for (;i < KETA;i++) printf("%d",a[i]); printf("\n"); return 0; }

  • chie65535
  • ベストアンサー率43% (8508/19344)
回答No.3

まず1)を。 #include<stdio.h> #define KETA 12 int main(void){ int a[KETA] = { 0, 0, 0, 1, 0, 2, 4, 6, 5, 5, 3, 6}; int x = 512; int i,j,n; for (i = 0;i < KETA;i++) a[i] *= x; for (i = 0;i < KETA;i++) { n = a[i]; a[i]=0; j=i; while ((n) && (j >= 0)) { a[j] += n % 10; if ((a[j] > 10) && (j)) { a[j]-=10; a[j-1]++; } j--; n /= 10; } } printf("a = "); for (i = 0;i < KETA;i++) if (a[i]) break; for (;i < KETA;i++) printf("%d",a[i]); printf("\n"); return 0; }

回答No.2

#1さんもおっしゃっている通り、全部筆算のようなことをやるだけですよね。 2の出力がわかっても何の役にも立たないと思いますが、検算に使う程度にはなると思うので80の階乗を書いておきます。 71569457046263802294811533723186532165584657342365752577109445058227039255480148842668944867280814080000000000000000000 ちなみに、多倍長数演算を行うためのライブラリーを使って計算しました。GNU MP (GMPとも言う) が有名ドコロで、RSAなどの計算のためにOpenSSLにも備わっているという感じでしょうか。 参考までにプログラムを書いておきます。コンパイル、リンクのためにはそれぞれGMP、OpenSSLのヘッダーやライブラリーが必要です。 GNU MPを使った場合 #include <gmp.h> int main(void) { unsigned int factorial_of; mpz_t result; mpz_init(result); for (factorial_of = 1; factorial_of <= 80; factorial_of++) { unsigned int num; mpz_set_ui(result, 1L); for (num = factorial_of; num > 0; num--) mpz_mul_ui(result, result, num); gmp_printf("%Zd\n", result); } mpz_clear(result); return 0; } OpenSSLを使った場合 #include <openssl/bn.h> #include <openssl/crypto.h> #include <stdio.h> int main(void) { unsigned long factorial_of; BIGNUM* result = BN_new(); for (factorial_of = 1; factorial_of <= 80; factorial_of++) { unsigned long num; BN_one(result); for (num = factorial_of; num > 0; num--) BN_mul_word(result, num); char* out = out = BN_bn2dec(result); printf("%lu! = %s\n", factorial_of, out); OPENSSL_free(out); } BN_clear_free(result); return 0; } 一応これで2.の答えらしいものは出ますが、多倍長数演算を自分でやるのがこの課題だと思うのでこれを出したら0点です。

noname#258618
noname#258618
回答No.1

多倍長数(多倍長整数)は分かりますか? おそらく何かの授業の課題だと思いますが、多倍長数はbignumと言われる任意の精度の整数を表すことのできるデータ型のことです。 通常の整数の計算は、例えば 32 * 12のように単純に計算すれば良いのですが、intやlongでは桁が足りないような計算では単純に計算する事ができないので、問題のように配列などに格納します。 例えば1つ目の答えが分かっているということで、その答えを x = 512 で割ってみると、 52462354432 / 512 = 102465536 となり a[KETA] で示されている数字(多倍長数)の内容に一致します。 ここまでは分かっているかと思いますが、問題の要点は、配列で表された数字をどうやって計算するかということにあります。 いろいろな考え方がありますが、この計算は「筆算」をするときとよく似ています。 実際に2つの数をどうやって筆算していたかを順を追って考えれば、計算方法は自ずとわかると思います。

関連するQ&A

  • プログラミング関係で

    プログラミングで次の問題をどうすればいいのかわかりません。 教えてください 1.配列に次のデータが格納されており、 2,-8,5,-4,6,5,7,-3,-9,-1 奇数、偶数、負の数がそれぞれいくつあるかを数え、表示するプログラムを作成してください。 2.任意の整数Xを入力し、Xの階乗の結果を表示するプログラムを作成しなさい。ただし、Xの階乗の計算は別関数で行い、入力と結果の表示はmain関数で行うようにすること。

  • また、プログラミングで分からなくなったので、

    すみません、学校の課題(C言語)で 「任意の整数Xを入力し、Xの階乗の結果を表示するプログラムを作成しなさい。ただし、Xの階乗の計算は別関数で行い、入力と結果の表示はmain関数で行うようにすること。」 というのが出て、自分なりに作ってみたり、調べたのですが 別関数の意味やmain()の上の分に何が入るのかもわかりません。 それに下のプログラミングでちゃんと動くかもわからないです。 下に載せてみたので、よろしければ色々と言ってください。 お願いします #include<stdio.h> int { } main() { int kotae = 0; int kakezan,count,X; printf("整数Xを入力しなさい"); scanf("%d",&X); for(count = 0; count <= X; count++) { kotae = kakezan * X[count]; } printf("Xの階乗は%dです",kotae); }

  • プログラミングについて質問があります。

    プログラミングについて質問があります。 次のコードを実行すると変数midに代入される整数値はいくらですか? #include <stdio.h> #define A 10 #define B 20 #define WA A+B main() { int mid; mid =WA / 2; }

  • プログラミングにビットについて

    独学でプログラミングを勉強しているものですが、ビットについてまだ完全に理解できていません。 ビットというのは、メモリだとか、容量だとかという大雑把なことは分かっているのですが 詳しく完全に理解できてるわけではありません。 そこで 今日変数の復習をしていた所 教本の説明の欄の ○○(数字)ビット符号付き整数 みたいなものに疑問をもちまして 例えばintなら32ビット符号付き整数というような説明の形なのですが この場合のintの説明の解釈というのは 二進数で0一つで1ビットを占めているとして 32ビット符号付き整数というのは 二進数で言う+(-)0x31の数値を表現することができ、 なので この場合、+(-)を1ビット占めているので表現できる数字は10進数で言う+(-)2^31-1が限界ということでいいのでしょうか?

  • 桁あふれ誤差のプログラムで質問です。

    1から15までの階乗を計算するプログラムで、階乗を求める関数を定義してその結果を確認し、その際に階乗の計算を開始する数と終了する数を記号定数で定義(#defineを使って)したいのですが、分からなくて困っています。 関数を使わないで以下のようにやり、 #include <stdio.h> #include <math.h> int main(void) { int n; int ans=1; for(n=1;n<=15;n++) { ans=ans*n; printf("%d!=%d\n",n,ans); } return 0; } これをやってみてなんとか結果が確認できたのですが、上記のように、階乗を求める関数を定義して、この上記のプログラムを書き換えて、そのときに階乗の計算を開始する数と終了する数を記号定数で定義(#defineを使って)して行いたいのですが、 分からなくて本当に困っています。助けてください。

  • Javaプログラミング

    Javaプログラミングで分からない課題が出たので、教えてもらえませんか? 実行結果 1つ目の整数を入力してください。 23 2つ目の整数を入力してください。 12 足し算の結果:35 引き算の結果:11 プログラムの大枠はこのようになるのですが public class 〇〇 { public static void main(String[] args) { System.out.println("1つ目の整数を入力してください。"); } public static int add(int a,int b) { return (a + b); public static int sub(int a,int b) { } }

    • ベストアンサー
    • Java
  • 勉強の参考にさせて下さい

    前回と同じようにもう一つ過去問を手に入れたのですが、同じく回答が手に入らず困っています。 大変お手数だとは思いますが、もうすぐ行われる期末テストの参考にしたいので、出来る範囲で構いませんのでもしどなたか解いて頂ければ大変うれしく思います。 どうかよろしくお願いいたします。 引き放し法除算において各ステップで次のような処理を行うことで,整数の除算を実行でき る.但し,ri はi ステップ目の中間余り, qi は商のi ビット,D は除数である. ・中間余りを左シフトして2ri-1 を求める. ・if(2ri-1 * D >= 0) qi = 1; else qi = -1; ・ri = 2ri-1 - qi D (1) 被除数(X):00100110 (38),除数(D):0110 (6)のときのこの方式による除算ステップを 示せ. (2) 被除数(X):11011010 (-38),除数(D):1010(-6)のときのこの方式による除算ステップを 示せ. [3]IEEE754 標準浮動小数点数に関して以下の問に答えよ. (1)0xafbf0000 という表現のfloat 数の10 進の値(m X 2e の形式でよい)を求めよ. (2)-938.8125 のfloat 表現(16 進数)を求めよ. (3) int では表現できないが,float なら表現できる整数のうち,次の数を求めよ. (a) 正で絶対値が最小(最も0 に近い) (b) 負で絶対値が最小(最も0 に近い) [4]キャスト操作やfloat/double データ型を使用せずに,入力された数のビットを処理して, int/unsigned 数をIEEE754 表現のfloat にキャストする関数とそのドライバをC 又はC++ を用いて次のように書け. (1)処理関数:次のいずれかを選択して書け. (a) unsigned iToF(int): int 数をfloat に変換し,unsigned 数として返す.ま るめはIEEE default の“nearest, half way case to even”. (b) unsigned uToF(unsigned): unsigned 数をfloat に変換し,unsigned 数と して返す.まるめは切り捨て. (2)main 関数: 整数(無符号整数)を入力するとiToF(uToF)を用いて浮動小数点数 に変換してそのビットパターンを16 進で出力せよ.次に,そのfloat としての値を再度出 力し,入力した値と比較してみよ.それらは必ず一致するか.

  • C言語の勉強をしていて、for文と戻り値を使った階乗について分からずに

    C言語の勉強をしていて、for文と戻り値を使った階乗について分からずに困っています。 以下の点に留意して、階乗を計算するプログラムを作成する。 階乗とは、数字を1つづつ減らしながら掛け合わせたものです。つまり 5の階乗:5×4×3×2×1=120 3の階乗:3×2×1=6 となります。 main内 1)整数型の変数kazu、kekkaを宣言する。 2)“階乗を計算します。”を表示する。 3)実行例と同様の表示になるように、“整数を入力してください”を表示し、入力された値を、変数kazuに読み込む。 4)作成する関数名は、kaijyoとし、kazuを引数とし、戻り値をkekka に代入する。 6)“○の階乗は ○です。”と表示する。 関数kaijyo内 1)引数を変数名xとする。 2)整数型の変数i、valを宣言する。 3)計算結果をvalに入れていくために、valを初期化する(下記注意参照)。 4)iをカウンターとするfor文と複合代入演算子を使って階乗を計算する。 5)valの内容が戻り値となるようにする。 注意:階乗を計算するために、for文の中で複合代入演算子を使って階乗を計算します。しかし、for文に入る前のvalの初期化には注意が必要です。0に何を何回かけても0だと言うことを思い出してください。 という問題です。 それで私は下の通りに作りました。 #include <stdio.h> int kaijyo(int x); void main(void) { int kazu,kekka,kaijyo,sum; printf("階乗を計算します。\n"); printf("整数を入力してください"); scanf("%d",&kazu); kekka=kaijyo(kazu); printf("%dの階乗は%dです。",kazu,kekka); } int kaijyo(int x) { int i,val; val=1; x=1; for(i=1;i<=val;i++){ x=x*i; } return val; } しかし、メイクして実行してもどの階乗でも256になってしまいます。 どこが間違っているのか分からずに困っています。 よかったら教えてください。 よろしくお願いします。 カテゴリを間違ってしまっていたらすみません。

  • プログラミングのことで困っています。助けて下さい。

    プログラミングの問題がどうしても分からず、本当に困っています。 ・2x+y+3z=13 ・x+3y+2z=13 ・3x+2y+z=10 (解:x=1,y=2,z=3) を掃き出し法で解くプログラミングの問題で、次の(1)~(5)が何が当てはまるかどうしても分からないんです。 #include <stdio.h> #define N 3 /*未知数の個数*/ int main(void) { int i,j,k; double pivot,del; double a[N][n+1]={{2,1,3,13},{1,3,2,13},{3,2,1,10}}; /*係数行列*/ for(i=0;i<N;i++) { (1)____ /*ピボット係数*/ for(j=0;j<N+1;j++) /*ピボット行をピボットで割る*/ (2)____ for(k=0;k<N;k++) /*ピボット列の掃き出し*/ { if((3)____) { del=a[k][i]; for(j=i;j<N+1;j++) (4)____ } } } for(i=0;i<N;i++) (5)____ /*計算結果の表示*/ return 0; } 実行結果は x0=1.00 x1=2.00 x2=3.00 と表示させたいのですが、(1)~(5)の所がどうしても分からず、困っています。どなたか助けて下さい。お願いします。

  • JAVAのプログラミングです

    JAVAのプログラミングを教えてください 整数Xの十進表記を1桁右に循環的にシフトした(つまり、最右桁の数字を最左桁の位置に置く)数が、Xの2倍であるような整数Xのうち、最小のものを求めよ。 これをJAVAでプログラミングせよ。とのことです

    • ベストアンサー
    • Java