c言語初心者です。
今、scanfを使ったコンソール型の割り算の筆算を作ろうと考えているのですが、
2桁以上の筆算だと、最上位数(298だと2)を割ったりしなくてはいけません。
その場合、最上位数を取り出さなくてはいけないのですが、取り出す型か、方法が
知りたいです。
コンソール型の割り算の筆算について
Re: コンソール型の割り算の筆算について
適切なコードを書いて、コンパイルして、実行すればいいです。
数値か文字列かなどで方法は変わるので、入力部分など今までに書いたコードがあれば提示してください。
数値か文字列かなどで方法は変わるので、入力部分など今までに書いたコードがあれば提示してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
-
- 記事: 21
- 登録日時: 9年前
- 住所: 近畿
Re: コンソール型の割り算の筆算について
// 指定された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);
}
-
- 記事: 21
- 登録日時: 9年前
- 住所: 近畿
Re: コンソール型の割り算の筆算について
上の投稿をしたものです。
『値の特定の桁』を取り出す方法 を聞いてらっしゃるんですよね。
...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桁目』の値を取り出すにはどうするのか...
『値の特定の桁』を取り出す方法 を聞いてらっしゃるんですよね。
...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 回目 ]
-
- 記事: 21
- 登録日時: 9年前
- 住所: 近畿
Re: コンソール型の割り算の筆算について
手順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 』すると、『配列の最終要素を指す添字』となります。
『数字列の桁数』は 『右端』から、一桁..二桁.... とっ数えます.... 値を「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: コンソール型の割り算の筆算について
「scanf で入力した数」の最上位の数を取得したいときは、
「sprintf を使用して文字列」に変換するとよいと思います。
「コンソール型の割り算の筆算」という言葉の意味がよくわからないのですが、
もっと詳しく説明していただけますか?
次のプログラムの出力のようなものを期待しているのですか?
実行結果
「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;
}
-
- 記事: 21
- 登録日時: 9年前
- 住所: 近畿
Re: コンソール型の割り算の筆算について
/*
機能::コンソールから値を読み込み、任意の桁を取り出して変数に保持する。
引数::なし
*/
#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: コンソール型の割り算の筆算について
ある数の最上位の数が欲しいだけなら、その数を 10でどんどんHimazin さんが書きました:c言語初心者です。
2桁以上の筆算だと、最上位数(298だと2)を割ったりしなくてはいけません。
その場合、最上位数を取り出さなくてはいけないのですが、取り出す型か、方法が
知りたいです。
割っていき、商が 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;
}
参照したくなるはずなんですが、なぜ最上位数なんですか?