ここから質問投稿すると、最大4000ポイント当たる!!!! >>

c言語で%を使わない余りの出し方の問題を出されたのですが、色々考えたのですが全くわかりません
まず余りの限界(余りがどこまであるか)がどこまであるか。
そしてwhileかforを使って余りを出す方法を自分で考えたのですが全くできませんでした。

自分の中ではif文でaを余りとして(a==1 && a==2)など考えたりしました。
またこれはポインタも使わずavgr**なども使いません。

さらに発展した問題で
if文、switch文、for文、while文を使わないで余りを出すというのが出てきました

情けないのですが、何かアドバイスがあれば教えていただきたいと思います

このQ&Aに関連する最新のQ&A

A 回答 (9件)

割られる数を割る数で引いていって、割る数よりも小さくなったら、


それが余りでしょ。

この回答への補足

すいません、割られる数と割る数というのが1/2だとすると割られるのが1でしょうか?
1
割る
2
ですよね

補足日時:2012/05/25 14:54
    • good
    • 1
この回答へのお礼

for文も無事できました。
for(i=0;i<=x;i++){
c = ( a / b ) * b;
c = i - c;
}
printf("amari = %d\n",c);

色々と誤解を招き失礼しました。
No.1とNo.2がわかりやすかったのでベストアンサーにさせていただきます!

お礼日時:2012/05/25 15:16

整数系の変数の割り算ならば商は剰余を含まない整数になることを理解出来れば解るはず。




// a ÷ b の剰余をzとする。 a,bはどこかでセットされているものとする。

int x,,y,z

x = a / b;
y = x * b;
z = a - y;

z = a - (a/b) * b; // でも可能なはずだが処理系によってはうまく行かない可能性が有る。
    • good
    • 2

計算での出し方は出ているから、別な方法。


2の倍数限定で、andで出せますね。

int base = 127;
int amari = base & (32-1);

これは、127を32で割った場合で、マスク値を割る数-1にすることです。

この回答への補足

baseをaとおいて、amariをz = a & (b-1);
とすることで余りがでました。
しかし理屈がよくわからないです・・・

補足日時:2012/05/25 14:50
    • good
    • 0
この回答へのお礼

ひとまず余りは出ましたが・・・うーん?

お礼日時:2012/05/25 14:50

#6です。



else内の式が間違っていました。申し訳ございません。
    • good
    • 0

発展した問題というより、ifなどを使わないほうが基本ですね。

他の皆様のご回答の通りです。
逆にそれぞれを使った場合は、

// if (switch)
if( x / y == 0 )
 z = 0;
else
 z = x - x / y;


// for (while)
for(int i = 0; i < x; i++ ) {
 if( ( x - i ) / y == 0 ) {
  z = i;
  break;
 }
}

この回答への補足

質問に書き忘れがありました。
aとbをscanfで読み込み、a/bをするのです。
今↑のようにやるとどうしても
a:11
b:3
だとすると3と出てきます
ちなみに上て下は別の事と考えてもよろしいのでしょうか?

補足日時:2012/05/25 14:45
    • good
    • 0
この回答へのお礼

for文の方は参考になりました。
少しまだなぞめいていますが、理解したいと思います。

お礼日時:2012/05/25 15:15

一番安直なのは、div関数を使う方法です。



int a = 10, b = 3;
div_t d = div(a, b);
int rem = d.rem; /* 余り */

long型ならldivを、long long型ならlldivを使ってください。
double型ならfmodを使ってください。

この回答への補足

残念ながら関数などは使用しないみたいです。ごめんなさい

補足日時:2012/05/25 12:56
    • good
    • 0

c=a-整数化切り捨て関数(a/b)*b;

この回答への補足

切捨て関数とは・・・?
おそらく関数は使わないです。ライブラリのほうからひっぱるということはこの問題ではないと思います。

補足日時:2012/05/25 14:15
    • good
    • 0

C言語というより算数の問題ですけど。


「余り」とは何なのか思い出してみてください。

この回答への補足

算数ですね。余りがなぜ出るかはわかるんですが…

補足日時:2012/05/25 12:58
    • good
    • 1

もう一つ、


整数なら割り算して、割った数を掛け算して、元の値との差が余りです。
    • good
    • 1
この回答へのお礼

色々試行錯誤したらできました!
一応コードとしては
scanf("%d",&a);
scanf("%d",&b);

c = (a / b ) * b;
c = a - z;

でできました。
for文のほうもno.1を参考にしてみます。

お礼日時:2012/05/25 14:59

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q”/”を使わずに割り算したいんですが…

割り算(/)を使わずに加算(+)、減算(-)、乗算(*)のいずれかまたはは全てを使って割り算を行い、商と余りを求めるプログラムを作りたいのですが、どのようにしたらよいのでしょうか?

Aベストアンサー

まず、単純に考えると、何回引けるかをループでぐるぐる回して引き算しながらカウントすれば、商と引けなくなったところで余りがもとまりますよね。
それだと、被除数が相対的に大きくなると大変なので、乗算によるシフト(例えば10倍して引けるなら10回引いたのと同じということですよね)をしてやればいいかと思います。

Q商と剰余を同時に求める(C言語)

C言語についてですが、
整数の除算を行うときに、商と剰余を同時に求めることは可能なは
ずなので、1回の演算で両方知りたいのですが、c = a / b;だと商
だけ、d = a % b;だと剰余だけしか分からないです。
1回の演算で両方得たい場合はどう記述すればいいでしょうか?

Aベストアンサー

stdlib.hのdiv()ではダメなのですか?
商と余からなる構造体 div_tを返します。

Q数字の位ごとの値を表示するプログラム

scanfで入力した数字の位ごとの値を表示するプログラムを作りたいのですがどうしたらいいですか?

例えば1234という数字を入れたら
10の位・・・3
1の位・・・4
という感じです

Aベストアンサー

> 10の位・・・3

1234を10で割って小数点以下を切り捨て。→123.4→123
123を10で割った余りを求める。→3

> 1の位・・・4

1234を1で割って小数点以下を切り捨て。→1234
1234を10で割った余りを求める。→4

とか。

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

QC言語 配列の長さの上限

C言語で配列Array[N]の長さNの上限っていくらなんでしょうか?
もし可能なのであれば上限を2147483647にしたいのですが、方法を教えてください。

Aベストアンサー

そもそもWindowsの32bit版はアプリが仮想メモリ空間を2GBしか使えません。2GBを超えるには64bit版が必要です。
たとえ64bit版OSだとしても添え字が2147483647って、単純なintの配列だとしても4x2147483647=8GB必要ですね。実メモリ16GBとかのPCを用意しますか?
そもそも配列で2147483647個必要なアルゴリズムに問題ありだと思います。

Q複数桁10進数の*桁目だけを抽出したい

タイトルがすべてと言えてしまうのですが、
例えば、int宣言された"4287"(この値は変動します)という数値があったとして、1桁目の"7"だけを別の変数へ引き抜きたいのですが、その場合にはANDによるマスク処理による演算で処理可能なのでしょうか?
また、他に良い方法などありましたら教えていただけますでしょうか?

Aベストアンサー

★10進数ですので AND は使えませんね。
・簡単なサンプルを載せますので読み取って下さい。

サンプル1:
int value = 4287;
int a[ 4 ];

a[0] = (value % 10); value /= 10; // 1桁目を取り出す
a[1] = (value % 10); value /= 10; // 2桁目を取り出す
a[2] = (value % 10); value /= 10; // 3桁目を取り出す
a[3] = (value % 10); value /= 10; // 4桁目を取り出す

サンプル2:
int value = 4287;
int a;

a = (value % 10);
value -= a;

value → 4280
a → 7
になります。

Qif文の判定条件('||'と'&&'の使い方)

○if文の判定条件への理解が弱いため、下記プログラムを作成し、
疑問があったため、質問をしたいと思っております。

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

int main()
{
char moji[]= "A";
/***********************************************************/
if( 0 != strcmp( moji , "A" ) || strcmp( moji , "B" ) )
^^(1)
/***********************************************************/
{
printf( "文字不一致" );
}
else
{
printf( "文字一致" );
}

return (0);
}

○質問
「/*/」で囲ったif文の判定箇所になりますが、
この判定条件は"配列mojiに格納されている値が"A",または"B"以外の"
ときに、画面上に「文字不一致」を出力します。そうでなければ
「文字一致」を出力します。

今回、配列mojiには"A"が格納されており、「文字一致」が画面に
出力されるはずですが、「文字不一致」が出力されてしまいます。

判定条件が誤っていると思い、色々と試したところ、(1)の箇所を
「&&」にしたときに、「文字不一致」が出力されます。

「||」(論理和)と「&&」(論理積)が理解できていないと思われ、
この部分を交えて、何故「&&」にしないと「画面不一致」と出力
されないのかを、ご教授の程お願い致します。

○if文の判定条件への理解が弱いため、下記プログラムを作成し、
疑問があったため、質問をしたいと思っております。

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

int main()
{
char moji[]= "A";
/***********************************************************/
if( 0 != strcmp( moji , "A" ) || strcmp( moji , "B" ) )
^^(1)
/***********************************************************/
{
printf( "文字不一致" );
}
else
{
printf( "文字一致" );
}

...続きを読む

Aベストアンサー

No.3 です。

---------------------------
(1)は配列mojiにAが格納されていない場合
(2)は配列mojiにBが格納されていない場合

《 略 》

(3)では(1)と(2)で出力された値の論理積(偽と真の論理積)を取り、
偽となるので、else側に移り、「文字一致」が出力される。
---------------------------
この理解で、考え方としては合っています。
普段はこれでOKです。

ただ、C言語ではもうひとつ別の問題があります。
No.4 の方の回答でも触れられていますが。

もともと、&& や || の性質として、
&& が、「真」になるのは、両方が真の時だけ、つまり、左側が「偽」なら、右側が何であっても、「偽」
|| が、「偽」になるのは、両方が偽の時だけ、つまり、左側が「真」なら、右側が何であっても、「真」
という事があります。

C言語ではこれを積極的に取り入れており、
1) && は、左側が「偽」であれば、右側は調べなくても全体として「偽」になるに決まっている。したがって、右側は調べない。
2) || は、左側が「真」であれば、右側は調べなくても全体として「真」になるに決まっている。したがって、右側は調べない。

という動きをします。
ですから、このケースでは、(1)の部分が「偽」となった時点で、全体が偽になるのが明らかです。ですから、(2)の部分は、調べません。

よって、C言語の動きに沿っていえば、
(1)の部分が「偽」となる。だから、((2)を調べるまでもなく)(3)全体として、「偽」となり、else 部分が実行される
という流れになります。

もっとも、これは、結果としては真偽表と矛盾はしないので、補足にお書きになったような理解でも普通はかまいません。
ただし、&& や || 以降の部分を調べることが、他の影響を与える時(例えば、strcmp() の中に(たとえ話です)「一致した」とかいう出力を行う部分があったら、この出力が1回しかでなかったり(&& の前で「偽」が決定した時)2回出たり(&& の前が「真」だったので、後ろも調べた時)というように、この影響を考慮しなければならない場合もあります。

No.3 です。

---------------------------
(1)は配列mojiにAが格納されていない場合
(2)は配列mojiにBが格納されていない場合

《 略 》

(3)では(1)と(2)で出力された値の論理積(偽と真の論理積)を取り、
偽となるので、else側に移り、「文字一致」が出力される。
---------------------------
この理解で、考え方としては合っています。
普段はこれでOKです。

ただ、C言語ではもうひとつ別の問題があります。
No.4 の方の回答でも触れられていますが。

もともと、&& や || の性質として、
...続きを読む

Qprintf で二進表示を行いたい。

すみません。教えていただきたいことがあります。
printf で普通のintの値をフォーマット指定子を使用して二進表示をしたかったのですが見当たりませんでした。
どうにかintの内容を二進で確認したいのですが、どのようにすれば良いですか?
宜しくお願いします。

Aベストアンサー

★2進整数を表示する関数を自作すればよい。
・作り方は簡単で、最上位ビットから順に『0』と『1』を調べていき、ビットが
 立っていれば『putchar('1');』にして、ビットが OFF なら『putchar('0');』
 にすれば良いでしょう。
・下にサンプルを載せますので使いやすいように改良して下さい。

サンプル:
unsigned int bit = (1 << (sizeof(int) * 8 - 1));
int value = 12345; ←これが表示したい int 型の整数値です。

printf( "value の 2進表記は " );

for ( ; bit != 0 ; bit >>= 1 ){
 if ( value & bit ){
  putchar('1');
 }
 else{
  putchar('0');
 }
}
printf( " です。\n" );

最後に:
・1バイトが 8 ビットの環境が前提です。→まぁ、普通は 8 ビットですが…。
・上記のサンプルを関数などにすれば使いやすくなります。→print_bin()など
・以上。おわり。

★2進整数を表示する関数を自作すればよい。
・作り方は簡単で、最上位ビットから順に『0』と『1』を調べていき、ビットが
 立っていれば『putchar('1');』にして、ビットが OFF なら『putchar('0');』
 にすれば良いでしょう。
・下にサンプルを載せますので使いやすいように改良して下さい。

サンプル:
unsigned int bit = (1 << (sizeof(int) * 8 - 1));
int value = 12345; ←これが表示したい int 型の整数値です。

printf( "value の 2進表記は " );

for ( ; bit != 0 ; bit >>= 1 ){
 if...続きを読む

Qコンパイルエラー invalid operands to binary

自己啓発で入力文字列をBASE64デコードする関数を作っているのですが、L20~L23(a[0] = strchr(b64, p[0]) - b64;)でコンパイルエラーinvalid operands to binaryが発生して色々試行錯誤しているのですが、どうしてもエラーがとれません。
ソースをここに書くのは大変恐縮なのですが、原因がわかる方がいらっしゃいましたら、教えていただけないでしょうか?

char *Base64n(unsigned char *buf, size_t length, size_t *outlen)
{
const char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrst         uvwxyz0123456789+/=";
unsigned char *p;
unsigned char *q;
unsigned char a[4];
char *RtnBuf;
int j=0;
int cnt;

RtnBuf = (char *)malloc(length+1);
memset(RtnBuf, 0, length+1);

p = (unsigned char*)buf;
q = (unsigned char*)RtnBuf;
cnt = 0;
while(*p != 0) {
a[0] = a[1] = a[2] = a[3] = 0;
a[0] = strchr(b64, p[0]) - b64;
a[1] = strchr(b64, p[1]) - b64;
a[2] = strchr(b64, p[2]) - b64;
a[3] = strchr(b64, p[3]) - b64;

q[0] = ((a[0] << 2) | (a[1] >> 4)) & 0xff;
cnt++;

if (p[2] != '=') {
q[1] = ((a[1] << 4) | (a[2] >> 2)) &0xff;
cnt++;
}
if (p[3] != '=') {
q[2] = ((a[2] << 6) | a[3]) & 0xff;
cnt++;
}
p += 4;
q += 3;
}
*outlen = cnt;
return(RtnBuf);
}

コンパイルはRed Hatでgccを使ってコンパイルしています。
引数は第1引数がデコード対象の文字列、第2引数がデコード対象文字列長、第3引数がデコード後の文字列長で、戻り値がデコード後の文字列です。

自己啓発で入力文字列をBASE64デコードする関数を作っているのですが、L20~L23(a[0] = strchr(b64, p[0]) - b64;)でコンパイルエラーinvalid operands to binaryが発生して色々試行錯誤しているのですが、どうしてもエラーがとれません。
ソースをここに書くのは大変恐縮なのですが、原因がわかる方がいらっしゃいましたら、教えていただけないでしょうか?

char *Base64n(unsigned char *buf, size_t length, size_t *outlen)
{
const char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrst ...続きを読む

Aベストアンサー

手元にgccが無いので、Windowsのbcc32でコンパイルしてみたところ、
エラーが出ずに通ってしまいました。
だから自信がないのですが…。

a[0] = strchr(b64, p[0]) - b64;



a[0] = strchr(b64, p[0]) - b64[0];

に変えてみたらどうでしょう。
"invalid operands to binary"
は、たぶん、マイナスの両側で型が違っていることを
表しているのではないでしょうか。(←これも自信なし)
strchr()が返すのはchar *型ですが、
b64の型は、charの配列型です。
型が違うので、コンパイラが不正と判断したのかもしれません。

とするとbcc32でなぜ通ったかが問題になるのですが…。
C言語規格でも、ポインタ同士の引き算のところは
ややこしくなっています。
規格解釈の違いがあるのかもしれません。

Qdoubleの変数にintとintの割り算の結果を代入するとき

以下のようにするとdには0.5ではなく0が代入されます。

int x = 1, y = 2;
double d = x / y;

これを回避するために以下のようにするのが一般的だと習いました。

//1.
double d = (double)(x) / y; // これでdには0.5が代入される

これを以下のようにしてしまうのに問題はあるでしょうか?

//2.
double d = (double)(x) / (double)(y);
//3.
double d = x / (double)(y);

また、1.と2.と3.ではどれがより良いのでしょうか?
単純に好みの問題なのでしょうか?

以上、よろしくお願いいたします。

Aベストアンサー

恐れ入ります。

単純に好みの問題かと思います。
CやC++の規格に準拠したコンパイラであれば、結果的に同じ式として扱ってくれます。
***
ただし、1,2,3ではない別種の方法を良く用いるので参考までに挙げておきます。

int x = 1;
int y = 2;
double dpoX = 0;
double dpoY = 0;
double d = 0;

dpoX = (double)x;
dpoY = (double)y;
d = dpoX / dpoY; /* 計算するときには、精度を揃えておく */

整数を使う場面では整数を使い、倍精度の計算をするときには倍精度で計算するのが良いかと。混ぜると混乱の元です。
(個人的には、ハナからdoubleで取り扱うべきかと思います)

速度的には前述の1,2,3と同様に、計測できるほどの速度低下にはなりません。
(可読性を犠牲にするのは、「除算は遅いから使いたくない」という様な時だけにする方が良いと思います)

ご参考になれば幸いです。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング