【发布时间】:2021-02-20 13:26:41
【问题描述】:
我正在解决关于 e-Olymp 的问题。
我已经使用 c++ 解决了这个问题。这是我创建的一个程序:
#include <iostream>
using namespace std;
int m, MOD = 1000003;
struct Math //Deklaraasi struct dengan MOD
{
long pow_mod(long a, long p)
{
if (a >= m) a %= MOD;
if (a == 0) return 0;
if (p == 0) return 1;
long t = pow_mod(a, p / 2);
if (p & 1) return a * t % MOD * t % MOD;
return t*t % MOD;
}
long inverse(long a) { return pow_mod(a, MOD - 2); }
long C_MOD(long n, long k)
{
long ans = 1;
if (k > n / 2) k = n - k;
for (int i = 1; i <= k; i++)
{
ans *= n - k + i;
ans %= MOD;
ans *= inverse(i);
ans %= MOD;
}
return ans;
}
} math;
struct BST //Struct untuk BST
{
struct node {
int val, sz, F;
node *ch[2];
} *root;
void Del(node* T)
{
if (!T) return;
Del(T->ch[0]);
Del(T->ch[1]);
delete T;
}
void reset() //Fungsi untuk mereset
{
Del(root);
root = nullptr;
}
int getsz(node *T) { return T ? T->sz : 0; }
void insert(int v, node* &T)
{
if (!T)
{
T = new node();
T->val = v;
T->sz = 1;
}
else
{
insert(v, T->ch[v > T->val]);
T->sz = getsz(T->ch[0]) + getsz(T->ch[1]) + 1;
}
}
int f(node* T)
{
if (!T) return 1;
if (T->F) return T->F;
return T->F = (long)f(T->ch[0]) * f(T->ch[1]) % MOD \
* math.C_MOD(getsz(T->ch[0]) + getsz(T->ch[1]), getsz(T->ch[0])) % MOD;
}
} bst;
int main()
{
int T, n, A[1010];
scanf("%d", &T);
for (int kase = 1; kase <= T; kase++) //Perulangan sebanyak input pengguna atau T
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) scanf("%d", &A[i]);
//membuat BST
bst.reset();
for (int i = 1; i <= n; i++) bst.insert(A[i], bst.root);
int ans = bst.f(bst.root) * math.C_MOD(m, n) % MOD;
printf("%d\n", ans);
}
}
接下来我想尝试将程序转换成c语言,解决问题。但是我还是c语言的初学者,在应用c struct语言不能像c++那样制作的结构时遇到了一些问题。
如何解决问题或使用 c 语言中的适当结构将我的 c++ 程序转换为 c?
谢谢。
【问题讨论】:
-
你尝试了什么?它是如何失败的?你被困在哪里了?恭喜你意识到 C 不是 C++,但作为第一次试验,我只是要求 C 编译器编译它,看看会发生什么。你已经这样做了吗?
-
C中没有成员函数之类的东西。这需要重写,而不仅仅是“翻译”或“转换”。此外,在线竞赛编码网站不是真正学习另一种计算机语言的方式。这些网站希望您使用您已经知道的计算机语言,并且足够了解它,而不必询问如何使用该语言的问题。 -
c语言中,struct类型不能有函数。您可以将内部结构函数编写为普通函数,使用结构实例作为参数。
-
关于 C++ 发布的代码。看来
struct对象应该是class对象。struct示例中的函数应该是public或privatestruct对象中的每个变量都应该有一个访问函数。我在struct对象中看不到构造函数、析构函数和复制函数,因此它们将使用默认的构造函数、析构函数和复制函数生成。可能不是你想要的。