//★★★ 試験問題のJavaへの移植を試みる。 ★★★ // 例題 // 平成12年度春期 第2種情報処理技術者試験 // 午後 選択-問11(C言語) // 文字列を数値として乗算 import java.applet.*; import java.awt.*; import java.awt.event.*; //●本体である「decmult」関数を含むクラス //※このクラスはすべてスタティックメソッドで構成されている。 class Mult { //◆本試験問題の「decmult」関数と、ほとんど変わらない。 public static void decmult(char decA[],char decB[],char decC[]) { char decT[]=new char[decC.length], sign='+'; int ai, bi, ci=0, ti=0, al=0, bl=0, am, bm, tm; int carry=0, shift=0, wk; am=strlen(decA); bm=strlen(decB); if(am==0 || bm==0) { decC[0]='\0';return; } /*** 符号の検査 ***/ if (decA[0] == '+' || decA[0] == '-') al = 1; if (decB[0] == '+' || decB[0] == '-') bl = 1; if ((decA[0] == '-' && decB[0] != '-') || (decA[0] != '-' && decB[0] == '-')) sign = '-'; /*** 乗算 ***/ for (bi = bm - 1;bi >= bl; bi-- ) { for (ai = am - 1; ai >= al; ai--, ti++) { wk = (decA[ai] - '0' ) * (decB[bi] - '0') +carry; carry = wk / 10; wk %= 10; if (decT[ti] != '\0') { wk += (decT[ti] - '0'); if (wk > 9) { carry++; wk %= 10; } } decT[ti] = (char)(wk + '0'); } if (carry > 0) { decT[ti] = (char)(carry + '0'); carry = 0; } shift++; ti = shift; } /*** decC[] に格納 ***/ if (sign == '-') { decC[0] = sign; ci++; } tm = strlen(decT); for (ti = tm - 1; ti > 0; ti--) if (decT[ti] !='0') break; for ( ; ti >= 0; ti--, ci++) decC[ci] = decT[ti]; decC[ci]='\0'; } //◆少数の乗算ができるように、修正したプログラム public static void decmult2(char decA[],char decB[],char decC[]) { char decT[]=new char[decC.length], sign='+'; int ai, bi, ci=0, ti=0, al=0, bl=0, am, bm, tm; int carry=0, shift=0, wk; int ap, bp, tp; am = ap = strlen(decA); bm = bp = strlen(decB); if(am==0 || bm==0) { decC[0]='\0';return; } /*** 符号の検査 ***/ if (decA[0] == '+' || decA[0] == '-') al = 1; if (decB[0] == '+' || decB[0] == '-') bl = 1; if ((decA[0] == '-' && decB[0] != '-') || (decA[0] != '-' && decB[0] == '-')) sign = '-'; /*** 乗算 ***/ for (bi = bm - 1;bi >= bl; bi-- ) { if (decB[bi] == '.') { bp = bi + 1; bi--; } for (ai = am - 1; ai >= al; ai--, ti++) { if (decA[ai] == '.') { ap = ai + 1; ai--; } wk = (decA[ai] - '0' ) * (decB[bi] - '0') +carry; carry = wk / 10; wk %= 10; if (decT[ti] != '\0') { wk += (decT[ti] - '0'); if (wk > 9) { carry++; wk %= 10; } } decT[ti] = (char)(wk + '0'); } if (carry > 0) { decT[ti] = (char)(carry + '0'); carry = 0; } shift++; ti = shift; } /*** decC[] に格納 ***/ if (sign == '-') { decC[0] = sign; ci++; } tm = strlen(decT); tp = (am - ap) + (bm - bp)-1; for (ti = tm - 1; ti > tp; ti--) if (decT[ti] != '0') break; for ( ; ti >= 0; ti--, ci++) { if (ti == tp) decC[ci++] = '.'; decC[ci] = decT[ti]; } decC[ci]='\0'; } //◆「decmult」関数をJavaのStringクラスを使用して呼び出すためのメソッド public static String decmult(String strA,String strB) { char decC[]=new char[strA.length()+strB.length()+3]; decmult(strA.toCharArray(),strB.toCharArray(),decC); return new String(decC,0,strlen(decC)); } public static String decmult2(String strA,String strB) { char decC[]=new char[strA.length()+strB.length()+3]; decmult2(strA.toCharArray(),strB.toCharArray(),decC); return new String(decC,0,strlen(decC)); } //◆C言語のstrlen関数と同等の内容を定義。 public static int strlen(char c[]) { int n; for(n=0;n