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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

4回答

2997閲覧

int配列の最上位の桁の表し方

Cdi

総合スコア2

C

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/07/27 03:00

前提・実現したいこと

int配列で最上位の桁から「0」が入っている間は出力されないようにしたいです。

ここに質問の内容を詳しく書いてください。

・C言語で配列を用いて100桁以下の差を計算するプログラムを作っています。

該当のソースコード

c

1#include <stdio.h> 2#include <string.h> 3 4#define DIGIT 100 5 6int main(void) { 7 char a[DIGIT] = {0}, b[DIGIT] = {0}; 8 char sum[DIGIT] = {0},num[DIGIT]={0}; 9 int i, n, na, nb, r; 10 11 scanf("%s",num); 12 na = strlen(num); 13 for(i=0;i<na;i++) a[na-1-i]=num[i]-'0'; 14 15 scanf("%s",num); 16 nb=strlen(num); 17 for(i=0;i<nb;i++) b[nb-1-i]=num[i]-'0'; 18 19 n = (na>nb ? na : nb); 20 r=0; 21 for(i=0;i!=n;i++){ 22 if(a[i]>=b[i])r=a[i]-b[i]; 23 else { 24 r=(a[i]+10)-b[i]; 25 a[i+1]=a[i+1]-1; //次の位の値を1減らす 26 } 27 sum[i]=r; 28 29 } 30 for(i=n-1;i>=0;i--){ 31 ??? 32 printf("%d",sum[i]); 33 } 34 printf("\n"); 35}

試したこと

???に入る部分

if(sum[i]==0) continue; 0の時は出力しない

補足情報(FW/ツールのバージョンなど)


100000000000000000000↵
99999999999999999999

私のプログラム
000000000000000000001↵
正解のプログラム
1↵
となるようにしたいです。

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

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

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

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

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

fana

2021/07/27 05:39

本題とは関係ないですが, これ,答えが負になるパターンが扱えないですね.
guest

回答4

0

ベストアンサー

0なら出力しない、最下位桁なら出力する、とすればいい。
そして、初めて0以外が来た場合、なんかのフラグを立てて、それ以降は全部出力するようにする。

あるいは、ループを2つ用意、
最初は0以外が来るまでループさせ、
その次のループでは全出力、とかですな

投稿2021/07/27 03:07

編集2021/07/27 03:10
y_waiwai

総合スコア88042

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

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

episteme

2021/07/27 03:29

> 最初は0以外が来るまでループさせ、その次のループでは全出力 これだと最下位桁の0が出力されない。
y_waiwai

2021/07/27 03:42

まあ、当然最初のループは(最大桁数-1)回ってことになりますわな
Cdi

2021/07/27 05:12

コメントありがとうございます。 >0なら出力しない、最下位桁なら出力する、とすればいい。 そして、初めて0以外が来た場合、なんかのフラグを立てて、それ以降は全部出力するようにする。 実力不足で以下のように書くことしかできませんでした。 可能でしたら、アドバイスをいただきたいです。 for(i=n-1;i>=0;i--){ if(sum[i]==0) continue; //0なら出力しない if(i>=0) printf("%d",sum[i]); //最下位桁なら出力 }
y_waiwai

2021/07/27 05:21

最下位桁は0ですから、 if(i==0) printf(... です、が、このコードでは if(sum[i]==0) が先に来てるので効果ないです やるなら、 for(i=n-1;i>=0;i--){ if(sum[i]==0 && i != 0) continue; printf("%d",sum[i]); } てなところですね
y_waiwai

2021/07/27 05:23

が、これだけでは途中の0も出力されないので、 なんかのフラグを立てて、、、 という処理が必要です
Cdi

2021/07/27 06:40

ご丁寧にありがとうございます。 フラグの勉強にもなりました。
guest

0

求めている形とは違うような気もするが.

C

1int main(void) { 2 char a[DIGIT] = {0}, b[DIGIT] = {0}; 3 char sum[DIGIT] = {0},num[DIGIT]={0}; 4 int i, n, na, nb, r; 5 int xxx = 0; //★←変数1個追加 6 7 scanf("%s",num); 8 na = strlen(num); 9 for(i=0;i<na;i++) a[na-1-i]=num[i]-'0'; 10 11 scanf("%s",num); 12 nb=strlen(num); 13 for(i=0;i<nb;i++) b[nb-1-i]=num[i]-'0'; 14 15 n = (na>nb ? na : nb); 16 17 r=0; 18 for(i=0;i!=n;i++){ 19 if(a[i]>=b[i])r=a[i]-b[i]; 20 else { 21 r=(a[i]+10)-b[i]; 22 a[i+1]=a[i+1]-1; 23 } 24 sum[i]=r; 25 if( r!=0 )xxx = i; //★←ここで覚えておけば… 26 } 27 for(i=xxx;i>=0;i--){ //★←覚えた場所から表示すればいい 28 printf("%d",sum[i]); 29 } 30 printf("\n"); 31}

投稿2021/07/27 05:50

fana

総合スコア11996

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

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

0

C

1 i = n; 2 while (--i > 0 && sum[i] == 0) ; // 先行する 0 をスキップ 3 while (i >= 0) putchar(sum[i--] + '0');

sum は、int配列 ではありません。char配列で表した整数 です。

投稿2021/07/27 03:40

編集2021/07/27 04:12
kazuma-s

総合スコア8224

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

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

0

C

1#include <stdio.h> 2#include <stdbool.h> 3 4int main() { 5 int sum[] = { 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 0, 0 }; 6 int n = 12; 7 8 bool suppress = true; // 表示しないならtrue 9 for (int i = n-1; i >= 0; i-- ){ 10 if ( sum[i] != 0 ) { // 非0が見つかったら表示 11 suppress = false; 12 } 13 if ( !suppress || i == 0 ) { 14 printf("%d",sum[i]); 15 } 16 } 17 printf("\n"); 18 19 return 0; 20}

投稿2021/07/27 03:26

編集2021/07/27 03:28
episteme

総合スコア16612

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

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

Cdi

2021/07/27 03:54

コメントありがとうございます。 boolというのを初めて見ました。 初歩的な質問ですみません、if ( !suppress || i == 0 ) は何を表しているのでしょうか。よろしくお願いします。
episteme

2021/07/27 04:44 編集

「0サプレスしない または 最下位桁 であれば...」です。 # 条件:「または 最下位桁」がないと all-0 のとき何も表示されなくなりますから
Cdi

2021/07/27 06:43

ご丁寧にありがとうございます。 納得できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問