如何在 C 中连接具有所需时间的整数?



我想写一个这样的函数:

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 位结果的数量,但这也许不是特别有用。

最新更新