会津オンラインジャッジ:National Budget

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
みけCAT
記事: 6247
登録日時: 9年前
住所: 千葉県
連絡を取る:

会津オンラインジャッジ:National Budget

#1

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

次のURLの問題
http://rose.u-aizu.ac.jp/onlinejudge/Pr ... 15&lang=jp
で、以下のソースコードを書きましたが、Wrong Answerと出ます。
どこを直せばいいか教えてください。
お願いします。

コード:

#include <stdio.h>

int main(void) {
	int a[80];
	int b[80];
	int result[80];
	int ketaagari;
	int i,j;
	int max;
	int temp[80];
	char in;
	int overflow;
	int count,kazu;
	scanf("%d",&kazu);
	while(getchar()!='\n');
	for(count=0;count<kazu;count++) {
		for(i=0;i<80;i++) {
			a[i]=0;b[i]=0;
		}
		i=0;
		overflow=0;
		while((in=getchar())!='\n') {
			temp[i]=in-'0';
			i++;
			if(i>=80) {
				overflow=1;
				while(getchar()!='\n');
				break;
			}
		}
		if(overflow==0) {
			for(j=0;j<i;j++)a[j]=temp[i-j-1];
		}
		i=0;
		while((in=getchar())!='\n') {
			temp[i]=in-'0';
			i++;
			if(i>=80) {
				overflow=1;
				while(getchar()!='\n');
				break;
			}
		}
		if(overflow==0) {
			for(j=0;j<i;j++)b[j]=temp[i-j-1];

			for(i=0,ketaagari=0,max=0;i<80;i++) {
				result[i]=(a[i]+b[i]+ketaagari)%10;
				ketaagari=(a[i]+b[i]+ketaagari)/10;
				if(result[i]!=0)max=i;
			}
			if(ketaagari)overflow=1;
		}
		if(overflow==0) {
			for(i=max;i>=0;i--)printf("%d",result[i]);
			printf("\n");
		} else printf("overflow\n");
	}
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

mats

Re: 会津オンラインジャッジ:National Budget

#2

投稿記事 by mats » 9年前

現在のコードだと,80桁ちょうどの数字が入力されると"overflow"フラグが立ってしまうように見えます.

81文字目が'\n'の場合には,普通に計算しなくてはなりません.

アバター
五反田
記事: 21
登録日時: 9年前
住所: 千葉

Re: 会津オンラインジャッジ:National Budget

#3

投稿記事 by 五反田 » 9年前

改行の取り扱いが向こう側でどうなっているのか分からない(CRLFなのかLFなのかCRなのか)ので、読み取り部分をこのようにやるのも1つの手ではないでしょうか?
ただし、tempは大きめにサイズを確保してください。
こちらでは200確保で少し書きなおしたらいけました。

コード:

    	scanf(" %s ",temp);
    	i=strlen(temp);
    	if(i>80)overflow=1;
    	else for(j=0;j<i;j++)b[j]=temp[i-j-1]-'0';

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

Re: 会津オンラインジャッジ:National Budget

#4

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

matsさん
うまくいきました。
ありがとうございます。

コード:

#include <stdio.h>

int main(void) {
	int a[80];
	int b[80];
	int result[80];
	int ketaagari;
	int i,j;
	int max;
	int temp[80];
	char in;
	int overflow;
	int count,kazu;
	scanf("%d",&kazu);
	while(getchar()!='\n');
	for(count=0;count<kazu;count++) {
		for(i=0;i<80;i++) {
			a[i]=0;b[i]=0;
		}
		i=0;
		overflow=0;
		while((in=getchar())!='\n') {
			temp[i]=in-'0';
			i++;
			if(i>80) {
				overflow=1;
				while(getchar()!='\n');
				break;
			}
		}
		if(overflow==0) {
			for(j=0;j<i;j++)a[j]=temp[i-j-1];
		}
		i=0;
		while((in=getchar())!='\n') {
			temp[i]=in-'0';
			i++;
			if(i>80) {
				overflow=1;
				while(getchar()!='\n');
				break;
			}
		}
		if(overflow==0) {
			for(j=0;j<i;j++)b[j]=temp[i-j-1];

			for(i=0,ketaagari=0,max=0;i<80;i++) {
				result[i]=(a[i]+b[i]+ketaagari)%10;
				ketaagari=(a[i]+b[i]+ketaagari)/10;
				if(result[i]!=0)max=i;
			}
			if(ketaagari)overflow=1;
		}
		if(overflow==0) {
			for(i=max;i>=0;i--)printf("%d",result[i]);
			printf("\n");
		} else printf("overflow\n");
	}
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 会津オンラインジャッジ:National Budget

#5

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

五反田 さんが書きました:改行の取り扱いが向こう側でどうなっているのか分からない(CRLFなのかLFなのかCRなのか)ので、読み取り部分をこのようにやるのも1つの手ではないでしょうか?
C言語でテキストモードなら、自動的に変換してくれるのではないのでしょうか?
自分もよくわかりませんが。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
五反田
記事: 21
登録日時: 9年前
住所: 千葉

Re: 会津オンラインジャッジ:National Budget

#6

投稿記事 by 五反田 » 9年前

>>みけCATさん
どうやら自分の検討は間違っていたようですね。すいません。
手元で動かしてみたら上手く行かなかったので、そこらへんが原因かと思ったのですが。

閉鎖

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