给定
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
100
的Array
或具有值100
的CC_4?strtol
等于parseInt()
?long permute(long*, long*, long)
和long vec2polyEval(long*, long, long)
的目的是什么?main
的int argc
的目的是什么,其中argc
似乎在功能中使用?如何将
c
代码转换为javascript
等效?
long v1[100],v2[100],v3[100],u[100]
是否将v1
分配为具有.length
100
的Array
或具有值100
的Number
?
长度100的数组。
strtol
等于parseInt()
?
在正常情况下,是的。
请注意,在您的JS代码中,您不需要它,因为您要通过实际整数而不是字符串。
main
的int 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程序相同的结果。