Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有一种方法可以使用递归函数将int赋值到字符串中,而无需将数字反转两次?_C++_Arrays_String_Optimization_Recursion - Fatal编程技术网

C++ 有没有一种方法可以使用递归函数将int赋值到字符串中,而无需将数字反转两次?

C++ 有没有一种方法可以使用递归函数将int赋值到字符串中,而无需将数字反转两次?,c++,arrays,string,optimization,recursion,C++,Arrays,String,Optimization,Recursion,有没有一种方法可以使用递归函数将int赋值到字符串中,而不必在每次递归调用时将该数字反转两次 #include <string.h> #include <iostream> using namespace std; int numreverse(long int n, long int rev); void numtostring(unsigned int n, char str[]); int main() { char n[5]; numtost

有没有一种方法可以使用递归函数将int赋值到字符串中,而不必在每次递归调用时将该数字反转两次

#include <string.h>
#include <iostream>

using namespace std;

int numreverse(long int n, long int rev);
void numtostring(unsigned int n, char str[]);

int main()
{
    char n[5];
    numtostring(1234, n);
    cout << n << endl;
}

void numtostring(unsigned int n, char str[]){

    n = numreverse(n, 0);//reverse the int

    if (n <= 0)return;
    else{
        str[0] = (char)(n % 10 + (int)'0');
        str[1] = 0;
        n /= 10;
        n = numreverse(n, 0);//reverse it again before recursive call
        numtostring(n, str + 1);
    }
}

int numreverse(long int n, long int rev){
    if (n == 0)
        return rev;
    return numreverse(n / 10, rev * 10 + n % 10);
}
#包括
#包括
使用名称空间std;
整数倒数(长整数n,长整数rev);
void numtostring(unsigned int n,char str[]);
int main()
{
charn[5];
numtostring(1234,n);
cout终于做到了!(编辑-操作编辑问题,不使用静态变量和全局变量)

#包括
使用名称空间std;
void numtostring(unsigned int n,char str[])//未对函数n签名进行任何更改
{
char*count=str;
static int counter=0;//静态整数起作用
字符温度=0;
如果(n)
{
温度=n%10+“0”;
numtostring(n/10,计数);
}
*(计数+计数器)=温度;
如果(临时)计数[++计数器]='\0';
else计数器=0;
}
int main()
{
字符n[5]=“技术”;
numtostring(12,n);
库特
注意:
numtostring
本身必须是递归的,其签名不能修改

这是一个愚蠢的要求。我至少可以更改返回类型吗?这样代码就简单多了:

char * numtostring(unsigned int n, char * str)
{
    if (n >= 10) str = numtostring(n / 10, str);
    *str = n % 10 + '0';
    *++str = 0;
    return str;
}

接口>代码> NotoStruts()/Cuth>是C类接口。除了在代码中选择I/O操作()/代码>测试程序,代码完全可以是C而不是C++。 不将接口更改为

numtostring()的要求,因为它是递归的,它比它应该更复杂,效率也更低,如果你不允许使用其他的库函数,那么它是双重的。在C++中,你不应该在原始代码的数组中乱搞<代码> char < /C>之类的东西。但是,规则是规则。代码可以在没有<代码> NoRyScript()的情况下实现。
函数-用于重新反转以一个或多个零结尾的数字时失败(例如,1000反转为1,但1反转仍然为1,不是1000,或者是100、10甚至100000000?)

递归的关键技巧是确保基本情况得到正确识别和处理,然后递归情况建立在基本情况之上。这里,基本情况需要是“当值小于10时”,递归情况(值至少为10)需要获取前导数字的字符串(对应于值除以10),然后追加最后一位数字

让它变得棘手的是,函数不能假设任何关于
str
的内容,除了“指针指向可修改内存”和第一次调用时“有足够的空间容纳正在格式化的数字加上一个终端null”。特别是,它不能假设
str
在开头有一个空字节。因此,基本case必须确保字符串以null结尾;递归大小写必须附加到“已知以null结尾”字符串。这意味着代码的运行速度比约束不太严格的代码慢,因为递归大小写必须找到字符串的结尾以附加其数字

#include <iostream>
#include <cstring>  // memset() - used in test code

using namespace std;

void numtostring(unsigned int n, char str[]);

int main()
{
    int v;
    while (cin >> v)
    {
        char n[32];
        memset(n, '\xA5', sizeof(n));
        numtostring(v, n);
        cout << v << " == [" << n << "]\n";
    }
}

void numtostring(unsigned int n, char str[])
{
    if (n > 9)
    {
        numtostring(n / 10, str);
        while (*str != '\0')
            str++;
        *str++ = n % 10 + '0';
        *str = '\0';
    }
    else
    {
        *str++ = n % 10 + '0';
        *str = '\0';
    }
}
while
循环是一个麻烦,但却是必要的

使用辅助函数 由于
numreverse()
是允许的,因此代码显然可以使用作为解决方案一部分编写的函数,因此更有效的解决方案使用递归帮助函数,但此解决方案也违反了规则,因为
numreverse()
本身不再是递归的

#include <iostream>
#include <cstring>  // memset() - used in test code

using namespace std;

void numtostring(unsigned int n, char str[]);

int main()
{
    int v;
    while (cin >> v)
    {
        char n[32];
        memset(n, '\xA5', sizeof(n));
        numtostring(v, n);
        cout << v << " == [" << n << "]\n";
    }
}

static char *n2s_helper(unsigned int n, char *str)
{
    if (n > 9)
        str = n2s_helper(n / 10, str);
    *str = n % 10 + '0';
    return str + 1;
}

void numtostring(unsigned int n, char str[])
{
    str = n2s_helper(n, str);
    *str = '\0';
}
#包括
#include//memset()-用于测试代码
使用名称空间std;
void numtostring(unsigned int n,char str[]);
int main()
{
INTV;
而(cin>>v)
{
charn[32];
memset(n,'\xA5',sizeof(n));
numtostring(v,n);

如果您使用
std::string
而不是
char[]
(int)
,“0”
是没有意义的,因为所有小于int的类型都必须升级为int(或者如果
sizeof(char)=sizeof(int)
,则无符号int)无论如何,为什么不构建字符串并在最后反转一次该字符串?我的意思是,递归地将int 1234转换为字符串“4321”,然后反转一次以获得“1234”。
str[0]=n%10+'0';
是足够的,有很多方法可以在不反转数字的情况下完成。除此之外,反转数字很容易出错。反转1000两次不会得到1000。
int numreverse(long int n,long int rev){if(n==0)return rev;return numreverse(n/10,rev*10+n%10);}int main(void){y=numreverse(1000,0);int x=numreverse(y,0);printf(“x=%d,y=%d,z=%d\n”,x,y,z);返回0;}
if(temp)计数器+
?!?我想知道如果您尝试用这样的代码打印
101
,会发生什么情况。请注意,如果您的函数被多次调用,
计数器将永远不会重置为0,因此在第一次非递归调用函数完成后,您将写入错误的位置。使用静态变量也意味着ode不可重入;不能在线程化应用程序中使用。有时,静态变量是执行某些操作的方式;这不是其中一种情况。当我将
main()
转换为循环(如我的回答中所示)时,我得到了输出:
0=[]
(oops)
1=[1]2=[12]3=[123]4=[1234]5=[12345]6==[123456]
etc,最终出现了seg故障。我修复了多个调用问题。我这方面有一个愚蠢的错误。我会看看我是否能解决另一个问题@JonathanLeffleri试图避免使用helper函数,比如reverse和all,但似乎无法做到,除非我违反了这三个条件之一。当我运行你修改后的代码时,我得到了
12CH
作为第一个输出。我可以通过将函数中最后一个
if/else
语句更改为:
if(temp){counter++;count[counter]='\0';}else counter=0;$ n2s < data.n2s
0 == [0]
1 == [1]
2 == [2]
3 == [3]
4 == [4]
5 == [5]
6 == [6]
7 == [7]
8 == [8]
9 == [9]
10 == [10]
11 == [11]
99 == [99]
100 == [100]
999 == [999]
1000 == [1000]
1001 == [1001]
1002 == [1002]
$
void numtostring(unsigned int n, char str[])
{
    if (n > 9)
    {
        numtostring(n / 10, str);
        while (*str != '\0')
            str++;
    }
    *str++ = n % 10 + '0';
    *str = '\0';
}
#include <iostream>
#include <cstring>  // memset() - used in test code

using namespace std;

void numtostring(unsigned int n, char str[]);

int main()
{
    int v;
    while (cin >> v)
    {
        char n[32];
        memset(n, '\xA5', sizeof(n));
        numtostring(v, n);
        cout << v << " == [" << n << "]\n";
    }
}

static char *n2s_helper(unsigned int n, char *str)
{
    if (n > 9)
        str = n2s_helper(n / 10, str);
    *str = n % 10 + '0';
    return str + 1;
}

void numtostring(unsigned int n, char str[])
{
    str = n2s_helper(n, str);
    *str = '\0';
}