質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

4847閲覧

N進法変換

drumath2237

総合スコア91

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2015/06/13 14:04

こんばんは。
Cを勉強している高校一年生です。学校で数学の研究をしていまして、そこで10進数をN進数に変えるプログラムを書いています。しかしどうにもうまくいきません。下にコードを記します。

lang

1#include "convert.h" 2 3int main(void) 4{ 5 int num,x; 6 while (1) { 7 scanf("%d %d",&num,&x); 8 if(x==0){ 9 return 0; 10 } 11 printf("num=%d\n\n",convert(num,x)); 12 } 13 14} 15

lang

1//convert.h 2#include <stdio.h> 3 4int convert(int num,int x) 5{ 6 7 int a[100]; 8 int i=0; //array counter 9 int j; 10 int sum=0; 11 int k; 12 long po; 13 14 do{ 15 a[i]= num % x; 16 num /= x; 17 i++; 18 }while(num > 0); 19 20 // for(j=0;j<=i;j++){ 21 // printf("arr[%d]=%d\n",j,a[j]); 22 // } 23 24 for(j=0;j<i-1;j++){ 25 po=1; 26 for(k=0;k<j;k++){ 27 po*=10; 28 } 29 30 sum+=a[j]*po; 31 printf("\na[%d]=%d\n",j,a[j] ); 32 printf("po=%d\n",po ); 33 printf("sum=%d\n",sum); 34 } 35 printf("\npo=%d\n",po ); 36 po=po*10; 37 printf("\npo=%d\n",po ); 38 sum+=a[i-1]*po; 39 printf("\na[%d]=%d\n",i-1,a[i-1] ); 40 printf("sum=%d\n",sum); 41 42 return sum; 43 44}

どううまくいかないかというと、配列に割った余りを格納しているのですが、最後のpoに10をかけているだけなのに、ゴミが出力されます。どうしてでしょうか?
ご回答よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

for(j=0;j<i-1;j++) のforループは i が 2以上でないと処理されないので、poが初期化されないことがあり、po の値が不定になっているのだと思います。

宣言時に long po=0; とすればいいと思います。

投稿2015/06/13 14:24

takutok

総合スコア392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

直接の質問の回答にはなっていないので、単なるコメントですが。

ある整数は、何進数で扱っても、表記が変わるだけで整数としては同じです。
たぶんやりたいことは「特定の10進数表記をN進数表記に変換した『文字列表記』」だと思うので、convert() の返り値は *char にした方がよいのでは ?

現在のコードだと、返り値は「10進数表記すると、たまたま元の10進数をN進数表記に変換したときと同じ表記になる、別の整数」です。この関数を別の所で流用すると、与えたのと別の整数が返ってくるだけで、ややこしいですよ。

投稿2015/06/13 15:36

H_Kuruno

総合スコア65

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

これだと逆順に出力されますがw

lang

1#include <stdio.h> 2 3int main() 4{ 5 const char num[]= "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 6 const int base= 16; // 16進 7 8 int n= 50000; // 元の数 9 while( n > 0 ){ 10 putchar(num[n%base]); 11 n /= base; 12 } 13 putchar('\n'); 14 15 return 0; 16}

~/test ./a.out
053C ←本当はC350
~/test

投稿2015/06/14 10:54

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

drumath2237

2015/06/14 12:00

みなさん、ご回答ありがとうございました。 確かに整数型で出力するのは仕様上よくないと思いました。 cateyeさんの方法を参考にさせていただきます。
cateye

2015/06/14 12:15

変換元が0の場合何も表示されないので修正しました。 ついでに文字列の反転も実装してあります。 <pre><code> ~/test ./a.out 15F90 ~/test cat tst8.c #include <stdio.h> void reverse(char str[], int len); int main() { const char num[]= "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const int base= 16; // 16進 int n= 90000; // 元の数 char buf[32]; int pos= 0; // N進法の文字列を作る do{ buf[pos++]= num[n%base]; n /= base; }while( n > 0 ); // 文字列の最後 buf[pos]= '\0'; // 文字列を反転 reverse(buf,pos); // 表示 puts(buf); return 0; } void reverse(char str[], int len) { char tmp; for(int i= 0; i < len/2; i++ ){ tmp= str[i]; str[i] =str[len-i-1]; str[len-i-1] =tmp; } } ~/test </code><pre> ・・・タグ使えるんだろうか?
drumath2237

2015/06/14 12:19

お世話になります。 ありがとうございました。
guest

0

ほかの方の回答でも指摘されてる通り、convert関数の戻り値が整数だと10進数より大きい底の数の表示に対応できなくないですか?戻り値を文字列にするべきだと思います。

投稿2015/06/14 08:35

TaroToyotomi

総合スコア1430

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問