こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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;
}

投稿日時 - 2010-01-07 21:39:55

QNo.5575723

すぐに回答ほしいです

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

 簡単に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;
}

投稿日時 - 2010-01-08 22:48:57

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

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

投稿日時 - 2010-01-08 18:34:48

ANo.2

int _tmain(int argc, _TCHAR* argv[])

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

投稿日時 - 2010-01-08 11:40:29

ANo.1

御自身で一通り見てみましたか?

ざっと見たところ、VC++固有の記述もC++固有の記述もほとんどないので、C言語でもそのまま動くように思えますが?

唯一、main関数の宣言が
int _tmain(int argc, _TCHAR* argv[])
となってるくらい。これがVC++固有の記述らしいです。

投稿日時 - 2010-01-07 21:49:04

お礼

ありがとうございます。

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

投稿日時 - 2010-01-08 00:42:30

あなたにオススメの質問