C++ 转换C++;代码转换为C

C++ 转换C++;代码转换为C,c++,c,algorithm,C++,C,Algorithm,我遇到了一个有趣的算法,我很难用C语言实现它 我确实在C++中找到了代码,但是我尝试把C++代码转换成C,但是程序崩溃了。p> C++代码如下: int BalancedPartition ( int a[] , int n ){ int sum = 0; for( int i = 0 ; i < n ; i++) sum += a[i]; int *s = new int[sum+1]; s[0] = 1; for(int i

我遇到了一个有趣的算法,我很难用C语言实现它

我确实在C++中找到了代码,但是我尝试把C++代码转换成C,但是程序崩溃了。p> C++代码如下:

int BalancedPartition ( int a[] , int n ){

    int sum = 0;
    for( int i = 0 ; i < n ; i++)
        sum += a[i];

    int *s = new int[sum+1];

    s[0] = 1;
    for(int i = 1 ; i < sum+1 ; i++)    s[i] = 0;

    int diff = INT_MAX , ans;

    for(int i = 0 ; i < n ; i++)
    {
        for(int j = sum ; j >= a[i] ; j--)
        {
            s[j] = s[j] | s[j-a[i]];
            if( s[j] == 1 )
            {
                if( diff > abs( sum/2 - j) )
                {
                    diff = abs( sum/2 - j );
                    ans = j;
                }

            }
        }
    }
    cout<< ans << " " << sum-ans<< endl; //two balanced partitions

    return min( ans , sum-ans );
}
intbalancedpartition(inta[],intn){
整数和=0;
对于(int i=0;i=a[i];j--)
{
s[j]=s[j]|s[j-a[i];
如果(s[j]==1)
{
如果(差值>绝对值(总和/2-j))
{
差值=绝对值(总和/2-j);
ans=j;
}
}
}
}

cout
sum+=*a[i];

显然是错误的,因为a是
指针,并且您已经使用
[]
运算符访问了它的元素。请删除不必要的取消引用(
*
运算符)

int*s[32467];

你的意思可能是让一个int数组而不是指向int的指针数组


ints[32467];

在C程序中,不能使用类似

for(int i=0....),
首先初始化一个变量

int i=0; 
然后继续循环,如:

for( i=0; i<n; i++ ) {...whatever you want to do in the loop...} 
<代码>(i=0;i)“新”运算符仅为C++,因此需要用CaloC:< /P>替换它。
int *s = calloc(sum+1,sizeof(int));
而不是

int *s = new int[sum+1];
cout<< ans << " " << sum-ans<< endl; // two balanced partitions 

“CUT”是C++的一个对象,所以用PrtfF替换它:

printf("%d %d \n",ans,sum-ans);  /* two balanced partitions */
而不是

int *s = new int[sum+1];
cout<< ans << " " << sum-ans<< endl; // two balanced partitions 

<代码> cOUT> P>原始代码使用很少的C++特定语法或语义,很容易重写为C代码。错误是S是一个类型的动态数组,类型为<代码> int >代码>,并且用一个类型为“代码> int **/COD> >的自动数组替换它。

对于直接翻译,请替换:

int* s = new int[sum+1] ;

可选地,由于函数接口没有C++特定的,并且假设它没有超载,所以可以简单地编译原始代码为C++的C链接:

extern "C" int BalancedPartition ( int a[] , int n )
{
   ...
编译为.c++文件,然后连接到C++代码中,函数可以调用为IS。< /P> C++的C++ C++代码,它是一个完全正确的C++代码,它是C++编写的。在C.编译的时候,大多数格式良好的C代码都会被编译成C++,没有变化,也没有什么改动,因为编译C++代码时,C++也会发现bug,C++中的类型检查更严格。

<> P> C++和C++试图重写它通常更好,尤其是C++是一种更大的语言,当C.< /P> <代码> INT*S(32467);< /COD>创建一个巨大的指针数组到整数时,许多简单的结构变得丑陋和复杂,你可能想要<代码> int s(32467)。C++语法是因为<代码>新< /C>。C和C++代码中的数组的行为相同,所以只是<代码>和+= A[i] < /Cord>。取消附加的<代码> */COD>不做你想要的。<代码> *[i]嘿,谢谢你们的回复,代码也会在稍后崩溃。你们有没有可能上传C代码?除了通过流和数组创建的输出,代码< < <代码> >,你的C++代码应该是C代码。如果你使用了<代码> Malc <代码>免费< /代码>组合代码。使用
new
或可变长度数组,并使用
printf
而不是C99中那些讨厌的
,您可以。在循环中使用
i
之前,也不需要初始化它。这不会导致崩溃。工作正常。如果
a[]的元素出现错误,我的C程序会给出错误的输出,为此干杯
是偶数..您知道如何解决此问题吗?+1表示您的答案。如果偶数元素问题是偶数,则将为接受的答案打勾sorted@user3353723当C++编译时,C++代码是否正确,输入偶数?不,它不知道。你知道如何修复吗?代码的目的是什么?是输入数组吗?应该排序的整数的y?如果a[]的元素即使…你知道要修这个吗?+ 1你的答案。嗨,克利福德,我不能编译它作为C++,因为我们被告知只包括C代码为我们的工作项目。它可能不合适回答你的次要问题发表在评论。你应该再发表一个问题,也许与你的实际代码(由于您尚未发布完整版本,因此信息不足)。但是,我强烈建议您使用工具链的调试器对代码进行单步调试,并在每一步观察变量状态,以确定出现了什么问题-这通常是一种更有效的调试方法,可以发布在SO或论坛上。@user3353723:我要警告不要使用“找到的代码”作为学术作业“资源”的未知来源或质量。除了剽窃问题之外,您可能没有能力确定代码的质量,并且可能无法在您的提交中解释或证明其设计(即,您将被抓住!)@user3353723:在现实世界中,没有人会对实现设置任意限制。任何出于学术原因而强加给您的解决方案限制都应该在问题中提及,因为从表面上看,您的解决方案(将代码转换为C)是最差的选择。此外,人们需要知道这是否本质上是一个错误“家庭作业”问题为了避免“为你做”——你可能也会被抓住——谷歌搜索“BalancedPartition”已经把这个问题作为第一个热门话题,任何明智的导师都会在谷歌上查看“你的工作”。
int* s = malloc( sizeof(int) * (sum + 1) ) ;
extern "C" int BalancedPartition ( int a[] , int n )
{
   ...