如何在c中连接所需时间的整数?

问题描述 投票:1回答:2

我想写一个这样的函数:

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函数。

c function integer concatenation
2个回答
1
投票

您的程序试图在INT_MAX中存储大于int的数字,这会导致转换期间出现溢出。即使你修改你的函数以获得size_t返回类型,这只会让你到目前为止。确保程序产生准确输出的唯一方法是将连接的整数存储为char*并将其返回。


1
投票

虽然可以在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位数结果的数量,但这可能并不特别有用。

© www.soinside.com 2019 - 2024. All rights reserved.