用递归实现正整数的逆序,最好是C/C++的 ( 积分: 120 )

  • 主题发起人 smithcouple
  • 开始时间
S

smithcouple

Unregistered / Unconfirmed
GUEST, unregistred user!
谢谢!!!
要求是,用递归函数完成,参数就是一个正整数,返回值为逆序转换完毕的正整数。
比如a=Reverse(1234),a是整型,值为4321。函数只有一个整型的参数,不能包含其他参数了。
我自己用while循环做了一个,但不符合题目。用递归实现实在没有头绪,主要是因为递归出来的顺序和循环都是反的,而且我的那个题目还要求必须直接转换出逆序后的整数,就卡住了。
 
呵呵,佷简单啊,我已给你做出来了,调试运行ok
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
function Reverse(x: integer): integer;
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.Reverse(x: integer): integer;//这是你要的反转函数
var
temp: integer;
tempResult: string;
begin
tempResult:='';
while x <> 0do
begin
temp:= x mod 10;
x:= x div 10;
tempResult:= tempResult+ chr(ord(temp)+ ord('0'));
end;
Result:= StrToInt(tempResult);
end;

procedure TForm1.Button1Click(Sender: TObject);//做测试用的,结果正确,呵呵
begin
Edit2.Text:= IntToStr(Reverse(StrToInt(Edit1.Text)));
end;

end.

程序核心思想是 : 借ascII码帮转换;
c++好长时间没用了,怕写出来有语法错,呵呵,但思路都是一样的,逻辑才是程序的本质,
语言只是工具,呵呵
 
#include <stdio.h>
void Reverse(int oldnum,int *newnum)
{
*newnum=*newnum*10+oldnum%10;
if(oldnum/10>0)
{
Reverse(oldnum/10,newnum);
}

}
main()
{
int a,b;
a=4321;
b=0;
Reverse(a,&amp;b);

printf(&quot;%d&quot;,b);
}
 
先谢谢大家
不过不是特别合适,因为必须得用递归,函数定义必须是
int Reverse(int Value) 这种形式的。
还是非常感谢!
 
return (Value<10 ? Value : 10*(Value%10) + Reverse( Value/10 ) );
——我上面的代码有问题,得不到正确答案。

个人觉得递归而不用其它辅助参数恐怕难以实现,应该加上长度参数(否则是无法区分
089与89的)。
 
上面的函数运行出错,似乎进入了死循环 我改了一下,但超过两位数的都不行了,这是为什么?
long Reverse(long Value)
{
if(Value<=0||Value>=10)
return 10*(Value%10)+Reverse(Value/10);
return Value;
}
 
那,用递归我也帮你搞顶了,已试过,运行正确:
(只要替代我上面那个Reverse函数即可,其他地方不要动)
function TForm1.Reverse(x: integer): integer;
var
temp: integer;
begin
if x <10 then
begin
Result:= x;
end
else
begin
temp:= x mod 10;
x:= x div 10;
Result:= StrToInt(IntToStr(temp)+IntToStr(Reverse(x)) );
end;
end;
 
delphi下没问题了
我尝试转成C的
long Reverse(long Value)
{
long temp;
if(Value<10)
{
return Value;
}
else
{
temp=Value%10;
Value/=10;
return temp+Reverse(Value);
}
}
结果不对,是不是有地方转错了?
 
Result:= StrToInt(IntToStr(temp)+IntToStr(Reverse(x)) );
return temp+Reverse(Value);
这里转换的不对啊,我的是 '1'+'2' to '12'
你的是 1 + 2 to 3 ,呵呵
 
lisongmagic正确
 
还是不行——只要中间带有数字0就错了——比如 1002 -> 21 还是那句话,长度不传
入,铁定会损失数字0的。
 
我的第一个写法,不用递归,可以解决这个bug问题;
若非要递归,呵呵,正在思考...
 
哈哈,终于搞定了,递归的,老样,只要替换我前面的那个函数即可,其他无需改动:
function TForm1.Reverse(x: integer): integer;
var
temp: integer;
function MyReverse(x: string):string;
var
tempStr: string;
i: integer;
begin
if length(x)= 0 then
exit
else
begin
for i:= 2 to length(x)do
tempStr:= tempStr +x;
Result:=MyReverse(tempStr)+x[1] ;
end;
end;

begin
Result:= StrToInt(MyReverse(IntToStr(x)));
end;
 
偷换概念了——你的递归函数的参数不再是数字而是字符串,而字符串本身就包含了自身
的长度信息!
另外,如果在递归的内部还用循环,那还要递归这个壳子作甚?——循环一遍,结果就能
算出来了。
 
谢谢楼上各位兄弟!
我也感到了,如果单用递归,恐怕真不好实现。可是老师硬是说可以做到。但又没提到具体方法。
如果用递归+字符串的方法可行吗?循环就不能加了,否则递归就真的成了空壳子。
 
function TForm1.Reverse(x: integer): integer;
var
temp: integer;
function MyReverse(x: string):string;
var
tempStr: string;
begin
if length(x)= 0 then
exit
else
begin
tempStr:= copy(x,2,length(x)) +x;//该变此处
Result:=MyReverse(tempStr)+x[1] ;
end;
end;

begin
Result:= StrToInt(MyReverse(IntToStr(x)));
end;

//没循环了,呵呵,不过还是不能逃脱兄长所指出的实质问题所在,呵呵
 
楼上的兄弟把整数的问题转成字符串问题处理,很灵活!
哎,老师干嘛非让用int呢。。。
 
意思是说我写的都不符合要求吗.
哦,好难过,mygod
 
不是那个意思啊,符合要求,别介意
我只是说老师的教学太较真了,非那么注重某个中间过程
 
呵呵,中国很多老师都恨不得教出来的学生都是一个模子里倒出来的——天才的创造力在
他们的眼中只不过是异端而已 :p
 

Similar threads

回复
0
查看
810
不得闲
回复
0
查看
853
不得闲
S
回复
0
查看
949
SUNSTONE的Delphi笔记
S
顶部