コンソール型の割り算の筆算について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Himazin

コンソール型の割り算の筆算について

#1

投稿記事 by Himazin » 9年前

c言語初心者です。
今、scanfを使ったコンソール型の割り算の筆算を作ろうと考えているのですが、
2桁以上の筆算だと、最上位数(298だと2)を割ったりしなくてはいけません。
その場合、最上位数を取り出さなくてはいけないのですが、取り出す型か、方法が
知りたいです。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: コンソール型の割り算の筆算について

#2

投稿記事 by みけCAT » 9年前

適切なコードを書いて、コンパイルして、実行すればいいです。
数値か文字列かなどで方法は変わるので、入力部分など今までに書いたコードがあれば提示してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

double-clutch.
記事: 21
登録日時: 9年前
住所: 近畿

Re: コンソール型の割り算の筆算について

#3

投稿記事 by double-clutch. » 9年前

コード:

// 指定された2乗値を求めるプログラム
// 「インド式乗算」を用いる。
// ここでは、変数 X は整数変数かつ三桁値とします。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int  get_no(const char *, const int);

int main(void)
{
	char str[80];
	int A[5],
	    i,
	    j,
	    X;

	fputs("3桁の整数値を入力したください\n", stdout);
	do {
		X = atoi(fgets(str, 80, stdin));
	} while ((999 < X) || (X < 100));
	// Xの値が3桁値 (100 <= X <= 999) となるまで、入力をさせる

	i = get_no(str, 3);		
	A[0] =  i * i;

	A[1] =  get_no(str, 3);
	A[1] *= get_no(str, 2);
	A[1] *= 2;

	A[2] =  get_no(str, 3);
	A[2] *= get_no(str, 1);
	A[2] *= 2;
	i    =  get_no(str, 2);
	A[2] += i * i;
	A[3] =  get_no(str, 2);
	A[3] *= get_no(str, 1);
	A[3] *= 2;

	i    =  get_no(str, 1);
	A[4] =  i * i;	

	i = 0;
	j = A[i];
	while (++i < 5){
		j *= 10;
		j += A[i];
	}

	fprintf(stdout, "%d * %d == %d\n変数 jの値 %d\n", X, X, X*X, j);

	for (i = 0; i < 5; i++)
		fprintf(stdout, "配列 Aの%d番目の値:%3d\n", i, A[i]);



	return 0;
}

int get_no(const char *cp, const int a) {
// 機能説明、与えられた数字列から任意の数字を、整数値として返す。
// 第一引数、数値を表す数字列
// 第二引数、取り出したい値の桁数
	char st[2];
	int  i;

	*(st + 1) = '\0';		// 文字列 stの最後尾に'\0'を代入
	if (a == 1) i = 2;
	else if (a== 2) i = 1;
	else i = 0;
	*st = *(cp + i);

	return atoi(st);
}


double-clutch.
記事: 21
登録日時: 9年前
住所: 近畿

Re: コンソール型の割り算の筆算について

#4

投稿記事 by double-clutch. » 9年前

上の投稿をしたものです。

『値の特定の桁』を取り出す方法 を聞いてらっしゃるんですよね。

...21行目の  X = atoi(fgets(str, 80, stdin)); を見ていただきたいのですが

手順1
  fgets() 関数にて、『stdin』== 標準入力より、文字列を読み取り、char型配列 str に格納します。

手順2
  fgets() 関数の戻り値  ----『char配列 strの先頭を指すポインタ』---- を引数に、 atoi() 関数を呼び出します。
  ...atoi() 関数の戻り値 ----『引数が数字列であれば対応した整数10進値を、それ以外は 0』---- を int型変数 X に代入する。

ここまでで、①str には文字列が保存されている、②X には整数値がほぞんされている...

手順3
  ....『変数 X の桁数』と『chra配列 str のサイズ』が等しいことになります。
  この段階で 仮に X の値が「595」だとすると、『chra配列 str のサイズ』は「3」っとなります。
  では、「595」の『第3桁目』の値を取り出すにはどうするのか...
最後に編集したユーザー double-clutch. on 2016年5月14日(土) 20:41 [ 編集 1 回目 ]

double-clutch.
記事: 21
登録日時: 9年前
住所: 近畿

Re: コンソール型の割り算の筆算について

#5

投稿記事 by double-clutch. » 9年前

手順3 続き...
  『数字列の桁数』は 『右端』から、一桁..二桁.... とっ数えます.... 値を「1」から数える『1base』方式
  一方、『C言語の配列の添字』は 『左端』から、1...2... っと数えます.... 値を「0」から数える『0base』方式です。

    /* うん 打ち込みミスです。 正しくは
      一方、『C言語の配列の添字』は 『左端』から、0...1... っと数えます.... 値を「0」から数える『0base』方式です。
    */

  ...『変数 X の最大桁 』の値は、...『配列 str の最初の文字』と等しい関係にあります。
  ...『変数 X の最小桁』の値は、...『配列 str の最期の文字』と等しい。

  ....『配列 str の最初の文字』を C_code で表すと str[0] 、『配列 str の最期の文字』を C_code で表すと str[strlen(str) - 1] となります。
  ....『 strlen(str) 』で配列 str の『 '/' ----ヌル文字---- を除いた要素の数』を求め、さらに 『 -1 』すると、『配列の最終要素を指す添字』となります。
最後に編集したユーザー double-clutch. on 2016年5月14日(土) 21:09 [ 編集 1 回目 ]

かずま

Re: コンソール型の割り算の筆算について

#6

投稿記事 by かずま » 9年前

「scanf で入力した数」の最上位の数を取得したいときは、
「sprintf を使用して文字列」に変換するとよいと思います。

コード:

#include <stdio.h>

int main(void)
{
    int a, n, m;
    char s[16];
    while (printf(">> "), scanf("%d", &a) == 1 && a >= 0) {
        n = sprintf(s, "%d", a);
        m = s[0] - '0';
        printf("桁数: %d、最上位の数: %d\n", n, m);
    }
    return 0;
}
「コンソール型の割り算の筆算」という言葉の意味がよくわからないのですが、
もっと詳しく説明していただけますか?
次のプログラムの出力のようなものを期待しているのですか?

コード:

#include <stdio.h>

int main(void)
{
    int a, b;
    while (printf(">> "), scanf("%d%d", &a, &b) == 2 && a >= 0 && b > 0) {
        static char line[] = "----------------";
        char sa[16], sc[16];
        int c = a / b;
        int nb = sprintf(sa, "%d", b);
        int na = sprintf(sa, "%d", a);
        int nc = sprintf(sc, "%d", c);
        int w = nb + 3 + na;
        printf("%*d\n" "%*.*s\n" "%d ) %d\n", w, c, w, na + 2, line, b, a);
        for (int i = 1; i < nc; i++) a /= 10;
        w -= --nc;
        for (int i = 0, j = na - nc; i <= nc; i++, j++) {
            c = b * (sc[i] - '0');
            printf("%*d\n", w, c);
            a -= c;
            if (j < na) a = a * 10 + sa[j] - '0', w++;
            printf("%*.*s\n" "%*d\n", w, nb + 2, line, w, a);
        }
    }
    return 0;
}
実行結果

コード:

>> 12345 67
       184
   -------
67 ) 12345
      67
     ----
      564
      536
      ----
       285
       268
      ----
        17
>> .

double-clutch.
記事: 21
登録日時: 9年前
住所: 近畿

Re: コンソール型の割り算の筆算について

#7

投稿記事 by double-clutch. » 9年前

コード:

/*
	機能::コンソールから値を読み込み、任意の桁を取り出して変数に保持する。
	引数::なし
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE 40			// strの最大文字数
#define MAX_BIT 12		// Aの最大文字数


int main(void)
{
	char str[SIZE],
		 A[MAX_BIT];	// 整数値の入力で使用する
	int X,				// 入力された整数値を保持
		bit,				// 任意の桁数を保持
		num,			// 数字列から取り出した値を保持
		len,			// 配列 str の長さ...文字数のこと
		index;			// 添字に使用する
		
		// Xに 1 以上の数値を入力する
		fputs("『整数値』を入力してください。\n", stdout);
		while ((X = atoi(fgets(str, SIZE, stdin))) < 1)
			fputs("1 以上の『整数値』を入力してください。\n", stdout);
		/* 上記のwhile文は読みにくいので、同じ意味のcodeをコメントします。
			fputs("1 以上の『整数値』を入力してください。\n", stdout);
			do {
			fgtes(str, SIZE, stdin);
			x = atoi(str);
			if (x < 1) fputs("1 以上の『整数値』を入力してください。\n", stdout);
			} while (x < 1);
		*/
		
		// fgets() 関数は、取り込んだ文字列の最後の文字が『改行文字(=='\0')』
		// であっても、取り除かない、なので、確認し必要ならば削除する。
		len = strlen(str);
		if (str[len - 1] == '\n') str[len-- - 1]  = '\0';
		
		// 任意の桁数を入力し、変数 bit に代入する
		fputs("任意の桁数を入力してください。\n", stdout);
		while ((bit = atoi(fgets(A, MAX_BIT, stdin))) < 1 || bit > len)
			fprintf(stdout, "1~%dまでの整数値を入力してください。\n", len);
		
		// indexを求める
		index =	 len - bit;
		
		// numを求める
		A[0] = str[index];
		num = atoi(A);
		
		// さぁさ、確認しようじゃないか!!!
		fprintf(stdout, "入力していただいた文字列 %s\n変数 X の値 %d\n%d桁目の値は....%d", str, X, bit, num);
		
		return 0;
}

かずま

Re: コンソール型の割り算の筆算について

#8

投稿記事 by かずま » 9年前

Himazin さんが書きました:c言語初心者です。
2桁以上の筆算だと、最上位数(298だと2)を割ったりしなくてはいけません。
その場合、最上位数を取り出さなくてはいけないのですが、取り出す型か、方法が
知りたいです。
ある数の最上位の数が欲しいだけなら、その数を 10でどんどん
割っていき、商が 0 になったときの被除数でよいでしょう。

コード:

#include <stdio.h>

int main(void)
{
    int a, b;
    while (printf(">> "), scanf("%d", &a) == 1) {
        while (b = a/10) a = b;
        printf("最上位の数は %d\n", a);
    }
    return 0;
}
でも、割り算の筆算だと、最上位ではなく、後続の数が一桁ずつ
参照したくなるはずなんですが、なぜ最上位数なんですか?

閉鎖

“C言語何でも質問掲示板” へ戻る