我想写一个这样的函数:
int number_maker(int n, int k)
{
if(k==1)
return n;
else
{
int x = 10;
while(n >= x)
x *= 10;
return (n*x) + number_maker(n,k-1) ;
}
}
举个例子,假设我的号码是350
。我想基于重复参数来制作它。我可以把它变成350350
但是当涉及到更多的重复,比如3或4次时,它就会出错。
我不能使用标准的C函数。
您的程序试图在INT_MAX
中存储大于int
的数字,这会导致转换期间出现溢出。即使你修改你的函数以获得size_t
返回类型,这只会让你到目前为止。确保程序产生准确输出的唯一方法是将连接的整数存储为char*
并将其返回。
虽然可以在32位int
中重复任何三位重复三次,但是不可能适合四次重复,因为只能表示所有9位十进制整数。
你重复三次的问题是因为在每次递归时x
总是1000(对于三位数n),而你实际上在第二次递归时需要它为1000000。解决这个问题有点麻烦,但你需要将x
传递到number_maker
:
int number_maker(int n, int k, int x) // <<< additional parameter
{
if(k==1)
return n;
else
{
int xx = x ; // <<< added
while(n * xx >= x) // <<< modified
x *= 10;
return (n*x) + number_maker(n,k-1, x) ;
}
}
然后打电话如:
printf("%d", number_maker( 350, 3, 1 ) );
将工作。这很麻烦,因为你必须传递一个初始的x
值,而这只能是1
。在C ++中,您可以使用默认参数来隐藏它。
但是,对于4次重复或3位十进制整数,它将不起作用。
那说:
printf("%d", number_maker( 1, 9, 1 ) );
printf("%d", number_maker( 9, 9, 1 ) );
工作还可以。你只能为n==1
逃脱10次重复。
printf("%d", number_maker( 1, 10, 1 ) );
基本上它适用于所有9位数结果和(不太有用)大约10位数的结果。
使用无符号整数会增加可以表示的10位数结果的数量,但这可能并不特别有用。