Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C语言中连接两个整数_C_Math_Optimization_Mathematical Optimization - Fatal编程技术网

如何在C语言中连接两个整数

如何在C语言中连接两个整数,c,math,optimization,mathematical-optimization,C,Math,Optimization,Mathematical Optimization,堆栈溢出在许多其他语言中都有这个问题的答案,但在C语言中没有。所以我想我会问,因为我也有同样的问题 如何在C中连接两个整数? 例如: x = 11; y = 11; 我希望z如下: z = 1111; 其他示例尝试使用字符串执行此操作。什么是不带任何字符串的方法 我正在寻找一种在C中实现这一点的有效方法,因为在我的特定用法中,这将成为代码中时间关键的部分 提前谢谢 int myPow(int x, int p) { if (p == 0) return 1; if (p

堆栈溢出在许多其他语言中都有这个问题的答案,但在C语言中没有。所以我想我会问,因为我也有同样的问题

如何在C中连接两个整数?

例如:

x = 11;
y = 11;
我希望z如下:

z = 1111;
其他示例尝试使用字符串执行此操作。什么是不带任何字符串的方法

我正在寻找一种在C中实现这一点的有效方法,因为在我的特定用法中,这将成为代码中时间关键的部分

提前谢谢

int myPow(int x, int p)
{
     if (p == 0) return 1;
     if (p == 1) return x;

     int tmp = myPow(x, p/2);
     if (p%2 == 0) return tmp * tmp;
     else return x * tmp * tmp;
}
int power = log10(y);
z = x*myPow(10,power+1)+y;
在这里,我无耻地复制了我的战俘

证明

我避免使用
log10
pow
函数,因为我很确定它们使用浮点运算,而且速度很慢,所以在您的机器上可能会更快。大概个人资料

z = x * pow(10, log10(y)+1) + y;
说明:

首先,您将获得变量的位数,该位数应排在第二位:

int digits = log10(y)+1;  // will be 2 in your example
然后将另一个变量乘以10^位,将其“移位”

int shifted = x * pow(10, digits);   // will be 1100 in your example
最后添加第二个变量:

z = shifted + y;   // 1111
或者在一行中:

z = x * pow(10, (int)log10(y)+1) + y;
也许这会奏效:

int x=11,y=11,temp=0;
int z=x;
while(y>0)
{
    // take reciprocal of y into temp
    temp=(temp*10)+(y%10);       
    y=y/10;
}
while(temp>0)
{
    // take each number from last of temp and add to last of z
    z=(z*10)+(temp%10);      
    temp=temp/10;
}
代码很长,但很简单。
如果有任何错误,请纠正我

还有另一种方法:

int concat(int x, int y) {
    int temp = y;
    while (y != 0) {
        x *= 10;
        y /= 10;
    }
    return x + temp;
}
谁知道你会得到什么样的表现。试试看吧。

#包括
#include<iostream>
using namespace std;

int main()
{
    int a=0,b=0,count=0,c=0,t=0;
    cout<<"enter 2 no"<<endl;
    cin>>a>>b;
    t=b;

    while(b!=0)
    {
        b=b/10;
        count++;
    }

    while(count!=0)
    {
        a=a*10;
        count--;
        c=a+t;
    }

    cout<<"concate no is:"<<c;
}
使用名称空间std; int main() { int a=0,b=0,count=0,c=0,t=0; 库特布; t=b; 而(b!=0) { b=b/10; 计数++; } while(计数!=0) { a=a*10; 计数--; c=a+t; }
cout这可能不是一个最佳或快速的解决方案,但没有人提到它,这是一个简单的解决方案,可能很有用

您可以使用
sprintf()
strtol()

首先用
sprintf()
将数字依次写入字符串(就像用
printf()
打印到标准输出一样),然后用
strtol()
将结果字符串转换为数字

strtol()
返回一个
long
,该值可能大于
int
中可以存储的值,因此您可能需要首先检查结果值

int result;
long rv=strtol(str, NULL, 10);
if(rv>INT_MAX || rv<INT_MIN || errno==ERANGE)
{
    perror("Something went wrong.");
}
else
{
    result=rv;
}
首先将第二个数字连同其符号一起打印到字符数组
temp

%+d
中的
+
将导致打印数字的符号

现在,将第一个数字和第二个数字打印到
str
,但不包含第二个数字的符号部分。我们通过忽略
temp
中的第一个字符跳过第二个数字的符号部分


最后,
strtol()
完成。

这里是@Mooing Duck答案的一个变体,它使用一个10倍数的查找表(对于整数乘法较慢的平台)它还返回unsigned long long以允许更大的值,并在查找表中使用unsigned long long解释@chqrlie关于无限循环的注释。如果可以保证组合输入不超过unsigned,则可以更改这些输入

static const unsigned long long pow10s[] = {
   10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,10000000000
};
unsigned long long concat(unsigned x, unsigned y) {
    const unsigned long long *p = pow10s;
    while (y >= *p) ++p;
    return *p * x +y;        
}

您还可以使用宏来连接字符串(简单方法)

#包括
#定义变更(a,b)a##b
int main()
{
int-y;
y=变化(12,34);
printf(“%d”,y);
返回0;
}

它有一个缺点,我们不能在这个方法中传递参数

,比如<代码> 100×x+y>代码>你想要c还是C++?答案是非常不同的。我想从C中得到C。需要是C谢谢。100*X+Y在y=0时失败。我想没有什么能打败你的答案。必须是代码> y>=POW/CODE >,我不认为<代码>tenate(1,10)
应该是20。你是对的,先生,因为我的某些数字不准确。修复了。而且,我完全没有说这比david的答案快17倍,比鼓手的快23倍。这是一个潜在的无限循环:例如,尝试
串联(100000000)
在32位系统上。如果(pow>UINT_MAX/10)在
循环中返回y;
则可以避免它。我对您的答案进行了投票,因为您实际解释了内容。“断言`func(0,10)==10'失败”OP可能还有其他的边缘情况。OP在C.寻求一种解决方案,你在C++中提供了一个解决方案,因为你正在使用 CIN < /C>和 CUT。此外,你回答一个已经有好几个答案的老问题。为什么你的解决方案更好,值得发布?这是一个很好的处理W的方法。可能溢出。添加相应的代码,设置和测试
errno
,并将结果与
INT\u MIN
INT\u MAX
进行比较会有帮助。
i
j
的负值也会导致问题。@chqrlie感谢您花时间告诉我们。我没有想到这个问题em是负数。或者需要查看
INT\u MIN
int result;
long rv=strtol(str, NULL, 10);
if(rv>INT_MAX || rv<INT_MIN || errno==ERANGE)
{
    perror("Something went wrong.");
}
else
{
    result=rv;
}
char str[100], temp[50];
int i=-32, j=45, result;
sprintf(temp, "%+d", j);
sprintf(str, "%d%s", i, temp+1);
long rv=strtol(str, NULL, 10);
static const unsigned long long pow10s[] = {
   10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,10000000000
};
unsigned long long concat(unsigned x, unsigned y) {
    const unsigned long long *p = pow10s;
    while (y >= *p) ++p;
    return *p * x +y;        
}
#include<stdio.h>
#define change(a,b) a##b
int main()
 {
    int y;
    y=change(12,34);
    printf("%d",y);
    return 0;
 }