• 締切済み

javaへの変換

class Integer def prime? n = self.abs() return true if n == 2 return false if n == 1 || n & 1 == 0 d = n-1 d >>= 1 while d & 1 == 0 20.times do a = rand(n-2) + 1 t = d y = ModMath.pow(a,t,n) while t != n-1 && y != 1 && y != n-1 y = (y * y) % n t <<= 1 end return false if y != n-1 && t & 1 == 0 end return true end end module ModMath def ModMath.pow(base, power, mod) result = 1 while power > 0 result = (result * base) % mod if power & 1 == 1 base = (base * base) % mod power >>= 1; end result end end 上記プログラムをjavaで書き直して頂きたく投稿いたしました。 もしよろしければお願いします。

  • Ruby
  • 回答数1
  • ありがとう数6

みんなの回答

回答No.1

#どこまで移植すれば妥当なのか…完全移植はおそらく言語仕様上無理。 ##JavaにC#の拡張メソッドのようなものはないと思う。 ##また、Javaはメソッド名に文字'?'を含められないと思う。

関連するQ&A

  • 助けてください・・・

    大学のプログラミングの講義で試験があり、以下の設問がありました。 次のプログラムのprintf文で何が表示されるか? #include<stdio.h> int pow2_a (int); int main (void) { printf("\n%d\n", pow2_a(12)); return 0; } int pow2_a (int n) { int p=1; if (n>0) { int tmp, m; m = n/2; printf("-- call pow2_a(%2d)\n", m); tmp = pow2_a(m); if (n%2==0) { p = tmp*tmp; } else { p = tmp*tmp*2; } } printf("-- return%8d\n", p); return p; } この答えが以下のようになるようです。   -- call pow2_a( 6) -- call pow2_a( 3) -- call pow2_a( 1) -- call pow2_a( 0) -- return 1 -- return 2 -- return 8 -- return 64 -- return 4096 そこで「--return 1 」と書いてあるところまでは分かるのですが、これ以下の表示が何故こうなるか理解できません。 お分かりの方教えてください。m(__)m

  • Rubyのプログラムについて

    Rubyのプログラムについて、宜しければ教えてください。 def fct(n, f=1) if n<=1 then f else fct(n-1, n*f) end end def factorial(n) (1..n).inject{|x,y| x*y} end def factorial(n) eval( [*(1..n)].join("*") ) end このプログラムが、階乗を計算するメソッドになっているみたいなのですが、なぜコレだけで階乗が計算できるのでしょうか? 宜しければ教えてください><

    • ベストアンサー
    • Ruby
  • どこがおかしいのでしょうか?

    #include <stdio.h> #include <math.h> #include <time.h> double pow_2_53 ; double pow_2_1022 ; double pow_2_1074 ; double abssucc(double x){ return x / (1 - pow_2_53); } double abspred(double x){ return x * (1 - pow_2_53); } double succ (double x){ if(abs(x) < pow_2_1022) return x + pow_2_1074; if (x >= 0) return abssucc(x); else return abspred(x); } double pred(double x){ if(abs(x) < pow_2_1022) return x - pow_2_1074; if (x >= 0) return abspred(x); else return abssucc(x); } int main(){ pow_2_53 = pow(2,-53); pow_2_1022 = pow(2,-1022); pow_2_1074 = pow(2,-1074); clock_t start, end; double r= 0; int i=0; start = clock(); for(i;i<1000000;i++){ r= succ(1); printf("%.50f\n",r); }end = clock(); printf("ループ100万回の時間: %f秒\n", (double)(end - start) / CLOCKS_PER_SEC); } このプログラムを動かしたいのですが、動きません。どこがおかしいのでしょうか? 教えて下さい!

  • strtol関数をmalloc()関数を使用して次のソースプログラムを

    strtol関数をmalloc()関数を使用して次のソースプログラムを修正しなさいを言われました。 どなたか詳しい方よろしくお願いします。 #include <limits.h> #include <ctype.h> #include <errno.h> #include <stdio.h> int _space_sign(const char *s, const char **endptr); int _space_sign(const char *s, const char **endptr) { int sign ; while (isspace((unsigned char)*s)) ++s; sign = 0; switch (*s) { case '-': sign = -1; // fall through case '+': ++s; break; } *endptr = s; return sign; } long int strtolong(const char * s, char ** endptr, int base) { int c; int sign = _space_sign(s, (const char**)&s); long result; if (s[0] == '0') { ++s; if ((s[1] | 0x20) == 'x') { if (base == 0 || base == 16) { ++s; base = 16; } } else if (base == 0) base = 8; } else if (base == 0) base = 10; result = 0; for (; c = tolower((unsigned char)*s), isdigit(c) || ('a' <= c && c <= 'v'); s++) { int d ; if( isdigit(c) ) d= c - '0' ; else d = c - 'a' + 10; if (d >= base) break; if (result > (LONG_MAX - d - sign) / base) { errno = ERANGE; result = sign ? LONG_MIN : LONG_MAX; } else { result = result * base + d; } } if (endptr != NULL) *endptr = (char*)s; if (sign != 0) result = -result; return result; } int main(void) { char s[128], *e; long n; int base; printf("何進数で変換しますか。"); scanf("%d", &base); printf("変換する数値を入力してください。"); scanf("%s", s); n = strtolong(s, &e, base); if (errno != ERANGE) { printf("変換数値=%ld\n", n); if (*e != '\0') { printf("変換不可能部分=%s\n", e); printf("%d文字目の\'%c\'が変換不可\n", e-s+1, *e); } } else if (n == LONG_MAX) printf("long値で表現できる値を上回りました。\n"); else if (n == LONG_MIN) printf("long値で表現できる値を下回りました。\n"); return 0; }

  • 最速化するにはどうしたらいいでしょうか?

    #include <stdio.h> #include <math.h> #include <time.h> double abssucc(double x){ return x / (1 - pow(2,-53)); } double abspred(double x){ return x * (1 - pow(2,-53)); } double succ (double x){ if(abs(x) < pow(2,-1022)) return x + pow(2,-1074); if (x >= 0) return abssucc(x); else return abspred(x); } double pred(double x){ if(abs(x) < pow(2,-1022)) return x - pow(2,-1074); if (x >= 0) return abspred(x); else return abssucc(x); } int main(){ clock_t start, end; double r= 0; int i=0; start = clock(); for(i;i<1000000;i++){ r= succ(1); printf("%.50f\n",r); }end = clock(); printf("ループ100万回の時間: %f秒\n", (double)(end - start) / CLOCKS_PER_SEC); } このプログラムをpow関数使わないでもっと速く動かしたいのですが、やり方がわかりません。 教えて下さい!お願いします。

  • 解けません!

    http://www.pref.fukushima.jp/pc-concours/2008/03/pdf/2007honsen.pdf この問題03の宅配料金の問題が解けません!! 書かれている入力例と出力例はあっているのですが、 学校のジャッジシステムが受けつけてくれません。 どなたか僕のプログラムの不備を見つけて下さい。 お願いします。 #include <stdio.h> int ryoukin(int x, int y, int h, int w) { int i,t,c; i = x + y + h; if (i <= 60) t = 600; else if (i <= 80) t = 800; else if (i <= 100) t = 1000; else if (i <= 120) t = 1200; else if (i <= 140) t = 1400; else if (i <= 160) t = 1600; else t = 0; if (w <= 2) c = 600; else if (w <= 5) c = 800; else if (w <= 10) c = 1000; else if (w <= 15) c = 1200; else if (w <= 20) c = 1400; else if (w <= 25) c = 1600; else c = 0; if (t == 0) return 0; else if (c == 0) return 0; else if (t < c) return c; else return t; } int main(void) { int x,y,h,w,n,i,sum; sum = 0; while(n != 0){ scanf("%d",&n); if(n != 0){ for(i = 0; i < n; i++){ scanf("%d %d %d %d", &x, &y, &h, &w); sum = sum + ryoukin(x,y,h,w); } printf("%d\n",sum); sum = 0; } } return (0); }

  • 2つの年月日の間の日数を求めるプログラム(PASCAL)

     大学の講義で、「2つの年月日を入力し、その年月日の間の日数を求めるプログラムを作成しなさい」という宿題が出たので、下のようにプログラムを作成したところ、…63(最後の行):parse error before '.'というエラーが出たのですが、なぜそのようなエラーが出るのかがわかりません。どう改善すべきか、アドバイスをお願いします。 program ex13(input,output); var year1,year2:1..9999; month1,month2:1..12; y1,y2:1..9999; m1,m2:1..12; d1,d2:1..31; n1,n2:1..9999999; begin writeln('question 13'); writeln('Please key the old date.'); write('Y: '); read(y1); write(' M: '); read(m1); write(' D: '); readln(d1); writeln('Please key the new date.'); write('Y: '); read(y2); write(' M: '); read(m2); write(' D: '); readln(d2); for year1:= 1 to y1 do begin if ((year1 mod 4 = 0) and not (year1 mod 100 = 0)) or (year1 mod 400 = 0) then n1:=n1+366 else n1:=n1+365 end; for month1:= 1 to m1 do begin case month1 of 3,5,7,8,10,12,1: n1:=n1+31; 4,6,9,11: n1:=n1+30; 2: if ((y1 mod 4 = 0) and not (y1 mod 100 = 0)) or (y1 mod 400 = 0) then n1:=n1+29 else n1:=n1+28 end; n1:=n1+d1; for year2:= 1 to y2 do begin if ((year2 mod 4 = 0) and not (year2 mod 100 = 0)) or (year2 mod 400 = 0) then n2:=n2+366 else n2:=n2+365 end; for month2:= 1 to m2 do begin case month2 of 3,5,7,8,10,12,1: n2:=n2+31; 4,6,9,11: n2:=n2+30; 2: if ((y2 mod 4 = 0) and not (y2 mod 100 = 0)) or (y2 mod 400 = 0) then n2:=n2+29 else n2:=n2+28 end; n2:=n2+d2; writeln('Ans.',n2-n1); end.

  • 配列

    このプログラムを #include<stdio.h> int x,y; int n; void RUL(int n),DLU(int n),LDR(int n),URD(int n); main() { scanf("%d",&n); printf("#位相%dのヒルベルト曲線\n",n); x=0; y=0;printf("(%d %d) \n)",x,y); RUL(n); } void RUL(int n) { if(n<=0) {return;} URD(n-1);x=x+1;printf("(%d %d)\n",x,y); RUL(n-1);y=y+1;printf("(%d %d)\n",x,y); RUL(n-1);x=x-1;printf("(%d %d)\n",x,y); DLU(n-1); } void DLU(int n) { if(n<=0) {return;} LDR(n-1);y=y-1;printf("(%d %d)\n",x,y); DLU(n-1);x=x-1;printf("(%d %d)\n",x,y); DLU(n-1);y=y+1;printf("(%d %d)\n",x,y); RUL(n-1); } void LDR(int n) { if(n<=0) {return;} DLU(n-1);x=x-1;printf("(%d %d)\n",x,y); LDR(n-1);y=y-1;printf("(%d %d)\n",x,y); LDR(n-1);x=x+1;printf("(%d %d)\n",x,y); URD(n-1); } void URD(int n) { if(n<=0) {return;} RUL(n-1);y=y+1;printf("(%d %d)\n",x,y); URD(n-1);x=x+1;printf("(%d %d)\n",x,y); URD(n-1);y=y-1;printf("(%d %d)\n",x,y); LDR(n-1); } 実行結果は (0 0) (0 1) ・ ・ ・ (0 254) (0 255) になります。これを2次元配列で表したのですがどのようにいじればいいでしょうか?おねがいします。

  • 変数の受け渡し double

    関数の中にある変数の型を変えたら不具合が出たのでそのことに ついて質問します。 ある変数値が負である関数のdouble型変数に受け渡した後に値が変わりました。 本でdoubleの範囲を調べると1.7 * 10^(-308) ~ 1.7 * 10^(+308) と書いてありました。doubleに負の数値を代入してはまずいのでしょうか? 具体的なプログラムを下に載せます。 int mod(double x,int p) { int ans; printf("x=%f prime=%d ",x,p); if(x >= 0){ if(x >= p) { ans=fmod(x,p); printf("fmod=%d\n",ans); }else{ ans=x; printf("mod=%d\n",ans); } }else{ do{ x+=p; }while(x < 0); ans=x; printf("mod=%d\n",ans); } return ans; } int rmd(struct zahyo *P,struct zahyo *Q,int prime) { unsigned int m,n; m=mod(Q->x - P->x,prime); n=mod(Q->y - P->y,prime); exeuclid(m,prime,1,0,0,1); printf("m=%d n=%d aa=%d aa*n=%d\n",m,n,aa,aa*n); return mod(aa*n,prime); } 実行結果の一部 m=10 n=6 aa=-1 aa*n=-6 x=4294967290.00000 prime=11 fmod=9    関数modのdouble型変数に負の数を受け渡すのはここ以外にもありますが このときだけ他の数値になりました。 考えられる原因は何かあるでしょうか?よろしくお願いします。

  • C言語でのプログラミングの問題が分かりません。

    C言語でのプログラミングの問題が分かりません。 課題で出た問題なのですがわからないのでおしえてください。 問題は 値を入力します(nとします) nが1でない間、以下の処理を繰り返します。  (1)nが偶数のとき、nを2で割り、その答えを新しいnとします。  (2)nが奇数のとき、nを3倍してから1を加え、その答えを新しいnとします。 というものです。 if文を使い計算はできたのですが、「繰り返し」と「新しいnとする」部分が分かりませんでした。作成したプログラムを載せるので手直しお願いいたします。 int n,x,y; printf("整数を入力"); scanf("%d",&n); while (n>1) if (n%2) printf("%d",x=n*3+1); else printf("%d",y=n/2); putchar('\n'); return(0); です。このままだと無限ループしてしまうので繰り返しの条件が悪いみたいです。 それと、答えをnに入れたいのにx、yを使ってしまっています。 回答お願いします。

専門家に質問してみよう