我想写一个这样的函数:
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
中存储大于INT_MAX
的数字,这会导致转换过程中溢出。即使您将函数修改为具有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 次重复或三位十进制整数,它不起作用。
可是:
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 位结果的数量,但这也许不是特别有用。