如何将C程序转换为JavaScript等效



给定

a217626的基本独立序列

/*
 * ########################################## 
 * # Base independent sequencer for A217626 #
 * ##########################################
 * 
 * This program is free software.
 * Written by R. J. Cano (remy at ula.ve, Or reemmmyyyy at gmail.com)
 * On Jan 9 2014, for educational purposes and released under 
 * the terms of the General Public License 3.0 (GNU-GPL 3.0);
 * 
 * There is NO warranty not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * 
 * Note: For a large set of terms (>10!-1) the present program might be prone to data type overflows.
 * 
*/
#include <stdio.h>
#include <stdlib.h>
long _base= 10;
long _showOffset= 1;
/** Standard output field width. An aid for comparisons using MD5 checksums. **/
long _normWidth= 13; 
/** Set this to 0 for print everything in a single line. **/
long _onePerLine= 1;
/** 0 for the vector representation, 1 for the integer representation **/
long _objectToShow= 1;
long permute(long*, long*, long);
long vec2polyEval(long*, long, long);
int main(int argc, char *argv[]) {
  long v1[100],v2[100],v3[100],u[100],n,k,l,offset=0;
  _showOffset*= _onePerLine;
  /* The size of the output (n!-1 items) is no longer read from the standard input. 
     scanf("%li",&n); -- Does stop silently, therefore it is avoided. */
  n= strtol(argv[1], NULL, _base); /* Direct conversion from the command line parameter(s) */
  for(k=0; k<100; k++) {
    v1[k]= (k<n)*(k);
    v2[k]= v1[k];
    v3[k]= 0;
  }
  while(permute(v2,u,n)) {
    for(k=0;k<n-1;k++) {
      v3[k+1]=0;
      for(l=k+1;l<n;l++) {
    v3[k+1]+=(u[l]-v2[l]);
      }
    }
    if (_showOffset) printf("%li ", ++offset);
    if (!_onePerLine) printf(",");
    if (!_objectToShow) {
      for(k=0;k+n<_normWidth;k++) { printf(",0"); }
      for(k=0;k<n;k++) { printf(",%li",v3[k]); }
      printf(";");
    } else {
      printf("%li", vec2polyEval(v3,_base,n));
    }
    if (_onePerLine) printf("n");
  }
  if (!_onePerLine) printf("n");
  return EXIT_SUCCESS;
}
long permute(long *data, long *previous, long Size) {
  long tau, rho=Size-1, phi=Size-1;
  for (tau=0;tau<Size;tau++) previous[tau]= data[tau];
  while((rho > 0)&&(data[rho]<= data[rho-1])) rho--;
  rho--;
  if(rho<0) return 0;
  while((phi > rho)&&(data[phi]<=data[rho])) phi--;
  tau= data[rho];
  data[rho]= data[phi];
  data[phi]= tau;
  Size--;
  rho++;
  while(Size>rho) {
    tau= data[Size];
    data[Size]= data[rho];
    data[rho]= tau;
    Size--;
    rho++;
  }
  return 1;
}
long vec2polyEval(long* v, long B, long m) {
  long ans=0, pow=1, k;
  for(k=m-1;k>=0;k--) {
    ans+= v[k]*pow;
    pow*= B;
  }
  return ans;
}

到目前为止尝试过的事情,这导致了JSFIDDLE的明显无限循环

var _base = 10;
var _showOffset = 1;
/** Standard output field width. An aid for comparisons using MD5 checksums. **/
var _normWidth = 13;
/** Set this to 0 for print everything in a single line. **/
var _onePerLine = 1;
/** 0 for the vector representation, 1 for the integer representation **/
var _objectToShow = 1;
// long permute(long*, long*, long);
// long vec2polyEval(long*, long, long);
function main( /*int argc, char **/ argv /*[]*/ ) {
  var v1 = Array(100),
    v2 = Array(100),
    v3 = Array(100),
    u = Array(100),
    n, k, l, offset = 0;
  _showOffset *= _onePerLine;
  /* The size of the output (n!-1 items) is no longer read from the standard input. 
     scanf("%li",&n); -- Does stop silently, therefore it is avoided. */
  n = parseInt(argv[1], _base); /* Direct conversion from the command line parameter(s) */
  for (k = 0; k < 100; k++) {
    v1[k] = (k < n) * (k);
    v2[k] = v1[k];
    v3[k] = 0;
  }
  while (permute(v2, u, n)) {
    for (k = 0; k < n - 1; k++) {
      v3[k + 1] = 0;
      for (l = k + 1; l < n; l++) {
        v3[k + 1] += (u[l] - v2[l]);
      }
    }
    if (_showOffset) console.log("%li ", ++offset);
    if (!_onePerLine) console.log(",");
    if (!_objectToShow) {
      for (k = 0; k + n < _normWidth; k++) {
        console.log(",0");
      }
      for (k = 0; k < n; k++) {
        console.log(",%li", v3[k]);
      }
      console.log(";");
    } else {
      printf("%li", vec2polyEval(v3, _base, n));
    }
    if (_onePerLine) console.log("n");
  }
  if (!_onePerLine) console.log("n");
  return "EXIT_SUCCESS";
}
function permute(data, previous, Size) {
  var tau, rho = Size - 1,
    phi = Size - 1;
  for (tau = 0; tau < Size; tau++) previous[tau] = data[tau];
  while ((rho > 0) && (data[rho] <= data[rho - 1])) rho--;
  rho--;
  if (rho < 0) return 0;
  while ((phi > rho) && (data[phi] <= data[rho])) phi--;
  tau = data[rho];
  data[rho] = data[phi];
  data[phi] = tau;
  Size--;
  rho++;
  while (Size > rho) {
    tau = data[Size];
    data[Size] = data[rho];
    data[rho] = tau;
    Size--;
    rho++;
  }
  return 1;
}
function vec2polyEval(v, B, m) {
  long ans = 0, pow = 1, k;
  for (k = m - 1; k >= 0; k--) {
    ans += v[k] * pow;
    pow *= B;
  }
  return ans;
}
main([1,2,3]);

问题:

  • long v1[100],v2[100],v3[100],u[100]是否将v1分配为具有.length 100Array或具有值100的CC_4?

  • strtol等于parseInt()

  • long permute(long*, long*, long)long vec2polyEval(long*, long, long)的目的是什么?

  • mainint argc的目的是什么,其中argc似乎在功能中使用?

  • 如何将c代码转换为javascript等效?

  • long v1[100],v2[100],v3[100],u[100]是否将v1分配为具有.length 100Array或具有值100Number

长度100的数组。

  • strtol等于parseInt()

在正常情况下,是的。
请注意,在您的JS代码中,您不需要它,因为您要通过实际整数而不是字符串。

  • mainint argc的目的是什么,其中argc似乎在功能中使用?

在C中,您正在处理原始内存,因此,为了不做一些愚蠢的事情,您需要知道数据结束的位置(在这种情况下,argv(。
并且C代码应该使用argc,至少要检查argv[1]是否存在。
在我的计算机上没有任何争论的情况下运行它会给我分割错误。

  • 如何将c代码转换为javascript等效?

首先,用var替换所有剩余的类型名称,否则您会遇到语法错误。
除此之外,您唯一需要照顾的是printf'S,恐怕您不能仅用console.log代替。
printf并未将新线附加到其参数上,而console.log则在单独的行上打印所有内容。此外,对printf的第一个参数可以包括格式指定符(%...(,该格式被以给定方式格式化的其他参数代替。

我将通过将函数更改为返回的输出而不是直接打印 it来解决此问题。为此,我会创建一个字符串的ret值,而不是使用printf,而是附加到该字符串。
至于格式说明器,如果您有

之类的东西
printf(",%li",v3[k]);

那么,这意味着"附加逗号和格式为长INT(%li(的v3[k]的值"。在JS中,那只是:

ret += "," + v3[k];

最后,我将更改输入的类型。当您只传递单个值时,您不需要JS中的argv数组(还请注意,在C,argv[0]中是程序本身的路径(。

所有应用的,我得到:

var _base = 10;
var _showOffset = 1;
/** Standard output field width. An aid for comparisons using MD5 checksums. **/
var _normWidth = 13;
/** Set this to 0 for print everything in a single line. **/
var _onePerLine = 1;
/** 0 for the vector representation, 1 for the integer representation **/
var _objectToShow = 1;
// long permute(long*, long*, long);
// long vec2polyEval(long*, long, long);
function main( /*int argc, char **/ arg /*[]*/ )
{
    var ret = "";
    var v1 = Array(100),
        v2 = Array(100),
        v3 = Array(100),
        u = Array(100),
        n, k, l, offset = 0;
    _showOffset *= _onePerLine;
    /* The size of the output (n!-1 items) is no longer read from the standard input. 
       scanf("%li",&n); -- Does stop silently, therefore it is avoided. */
    n = parseInt(arg, _base); /* Direct conversion from the command line parameter(s) */
    for(k = 0; k < 100; k++)
    {
        v1[k] = (k < n) * (k);
        v2[k] = v1[k];
        v3[k] = 0;
    }
    while(permute(v2, u, n))
    {
        for(k = 0; k < n - 1; k++)
        {
            v3[k + 1] = 0;
            for(l = k + 1; l < n; l++)
            {
                v3[k + 1] += (u[l] - v2[l]);
            }
        }
        if(_showOffset) ret += (++offset) + " ";
        if(!_onePerLine) ret += ",";
        if(!_objectToShow)
        {
            for(k = 0; k + n < _normWidth; k++)
            {
                ret += ",0";
            }
            for(k = 0; k < n; k++)
            {
                ret += "," + v3[k];
            }
            ret += ";";
        }
        else
        {
            ret += vec2polyEval(v3, _base, n);
        }
        if(_onePerLine) ret += "n";
    }
    if(!_onePerLine) ret += "n";
    return ret;
}
function permute(data, previous, Size)
{
    var tau, rho = Size - 1,
        phi = Size - 1;
    for(tau = 0; tau < Size; tau++) previous[tau] = data[tau];
    while((rho > 0) && (data[rho] <= data[rho - 1])) rho--;
    rho--;
    if(rho < 0) return 0;
    while((phi > rho) && (data[phi] <= data[rho])) phi--;
    tau = data[rho];
    data[rho] = data[phi];
    data[phi] = tau;
    Size--;
    rho++;
    while(Size > rho)
    {
        tau = data[Size];
        data[Size] = data[rho];
        data[rho] = tau;
        Size--;
        rho++;
    }
    return 1;
}
function vec2polyEval(v, B, m)
{
    var ans = 0,
        pow = 1,
        k;
    for(k = m - 1; k >= 0; k--)
    {
        ans += v[k] * pow;
        pow *= B;
    }
    return ans;
}
var ret = main('5');
// For demo:
document.body.innerText = ret;
document.body.style.whiteSpace = 'pre';

对于我测试的值,它给了我与C程序相同的结果。

最新更新