• ベストアンサー

C言語に直して下さい

VisualC++で円周率を求めるプログラムなのだそうですが、 自分はC言語しか使ったことがないため、よく分かりません。 Cでコンパイルできるように直していただけないでしょうか。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 21 #define K 100000 void add(unsigned long a[],unsigned long b[]) { int c = 0, tmp; for (int i = N - 1; i > -1; i--) { tmp = a[i] + b[i] + c; a[i] = tmp % K; c = tmp / K; } } void sub(unsigned long a[],unsigned long b[]) { int c = 0, x = 0; for (int i = N - 1; i > -1 ; i--) { x = c; if (a[i] < b[i] + x ) c = 1; else c = 0; a[i] = c * K + a[i] - b[i] - x; } } void div(unsigned long a[], unsigned long x) { int c=0, tmp; if (x >= K) { printf("Div Error\n"); getchar(); exit(1); return; } for (int i = 0; i < N ; i++) { tmp = (a[i] + c * K) / x; c = (a[i] + c * K) % x; a[i] = tmp; } } void clear(unsigned long a[]) { memset(a,0x00,sizeof(a)*N); } void set(unsigned long a[], unsigned long b[]) { memcpy(a,b,sizeof(a)*N); } void set(unsigned long a[], unsigned long b) { if (b<K) { clear(a); a[0]=b; } } int _tmain(int argc, _TCHAR* argv[]) { unsigned long pai[N], fn[N], gn[N], tmp1[N], tmp2[N]; int i; unsigned long n; clear(pai); clear(fn); clear(gn); clear(tmp1); clear(tmp2); set(fn, 16*5); set(gn, 4*239); for(n=0;n<40000;n++) { div(fn, 25); div(gn, 239); div(gn, 239); set(tmp1, fn); div(tmp1, 2*n+1); set(tmp2, gn); div(tmp2, 2*n+1); if (n%2==0) { add(pai, tmp1); sub(pai, tmp2); }else{ add(pai, tmp2); sub(pai, tmp1); } } for (i=0;i<N;i++) { printf("%5lu ", pai[i]); } getchar(); return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

 簡単にCに直せないように工夫されてますよね。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 21 #define K 100000 void add(unsigned long a[],unsigned long b[]) { int c, tmp, i; c = 0; for (i = N - 1; i > -1; i--) { // 訂正 int i; tmp = a[i] + b[i] + c; a[i] = tmp % K; c = tmp / K; } } void sub(unsigned long a[],unsigned long b[]) { int c, x, i; c = x = 0; for (i = N - 1; i > -1 ; i--) { // 訂正 x = c; if (a[i] < b[i] + x ) c = 1; else c = 0; a[i] = c * K + a[i] - b[i] - x; } } void _div(unsigned long a[], unsigned long x) { int c, tmp, i; c = 0; if (x >= K) { printf("Div Error\n"); //getchar(); exit(1); //return; } for (i = 0; i < N ; i++) { // 訂正 tmp = (a[i] + c * K) / x; c = (a[i] + c * K) % x; a[i] = tmp; } } void clear(unsigned long a[]) { memset(a,0x00,sizeof(a)*N); } void _set(unsigned long a[], unsigned long b[]) { memcpy(a,b,sizeof(a)*N); } void set_(unsigned long a[], unsigned long b) { if (b<K) { clear(a); a[0]=b; } } int main(int argc, char *argv[]) { // 訂正 unsigned long pai[N], fn[N], gn[N], tmp1[N], tmp2[N]; int i; unsigned long n; clear(pai); clear(fn); clear(gn); clear(tmp1); clear(tmp2); set_(fn, 16*5); set_(gn, 4*239); for(n=0;n<40000;n++) { _div(fn, 25); _div(gn, 239); _div(gn, 239); _set(tmp1, fn); _div(tmp1, 2*n+1); _set(tmp2, gn); _div(tmp2, 2*n+1); if (n%2==0) { add(pai, tmp1); sub(pai, tmp2); }else{ add(pai, tmp2); sub(pai, tmp1); } } for (i=0;i<N;i++) { printf("%5lu ", pai[i]); } printf("\n"); // 追加 //getchar(); return 0; }

その他の回答 (3)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

_tmainを直すだけではダメで、多重定義しているset関数も手直ししなければなりません。適当に関数名を変えてください。

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.2

int _tmain(int argc, _TCHAR* argv[]) を int main(int argc, char* argv[]) あるいは int main() に。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

御自身で一通り見てみましたか? ざっと見たところ、VC++固有の記述もC++固有の記述もほとんどないので、C言語でもそのまま動くように思えますが? 唯一、main関数の宣言が int _tmain(int argc, _TCHAR* argv[]) となってるくらい。これがVC++固有の記述らしいです。

tcnksukima
質問者

お礼

ありがとうございます。 void main() にすればよろしいのでしょうか。 ありがとうございました。

関連するQ&A