C++ 有没有一种方法可以使用递归函数将int赋值到字符串中,而无需将数字反转两次?
有没有一种方法可以使用递归函数将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
#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';
}