[英]How to concatenate two integers in C
Stack Overflow用許多其他語言回答了這個問題,但不是C.所以我想我會問,因為我有同樣的問題。
如何在C中連接兩個整數?
例:
x = 11;
y = 11;
我想z如下:
z = 1111;
其他示例嘗試使用字符串執行此操作。 沒有字符串的方法是什么?
我正在尋找一種在C中執行此操作的有效方法,因為在我的特定用法中,這將成為代碼的時間關鍵部分。
提前致謝!
unsigned concatenate(unsigned x, unsigned y) {
unsigned pow = 10;
while(y >= pow)
pow *= 10;
return x * pow + 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 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;
在這里,我無恥地從https://stackoverflow.com/a/1505791/1194873復制了myPow
這可能不是一個最佳或快速的解決方案,但沒有人提到它,它是一個簡單的解決方案,可能是有用的。
你可以使用sprintf()
和strtol()
。
char str[100];
int i=32, j=45;
sprintf(str, "%d%d", i, j);
int result=strtol(str, NULL, 10);
你首先用sprintf()
寫一個字符串,然后用另一個字符串寫一個字符串(就像用printf()
打印到stdout一樣),然后用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;
}
如果strtol()
返回的值不在int
的范圍內(即,不在(包括) INT_MIN
和INT_MAX
),則發生錯誤。 INT_MIN
和INT_MAX
來自limits.h
。
如果字符串中的值太大而無法用long
表示,則errno
將因為溢出而設置為ERANGE
(來自errno.h
)。
在這里閱讀strtol()
。
編輯:
正如chqrlie的啟發性評論指出的那樣,負數會給這種方法帶來麻煩。
你可以使用這個或修改它來解決這個問題
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);
首先將第二個數字與其符號一起打印到字符數組temp
。
+
%+d
將導致打印數字的符號。
現在打印第一個數字和第二個數字到str
但沒有第二個數字的符號部分。 我們忽略temp
的第一個字符,跳過第二個數字的符號部分。
最后strtol()
完成了。
這是另一種方法:
int concat(int x, int y) {
int temp = y;
while (y != 0) {
x *= 10;
y /= 10;
}
return x + temp;
}
誰知道你會得到什么樣的表現。 試着看看..
您還可以使用Macro來連接字符串(簡單方法)
#include<stdio.h>
#define change(a,b) a##b
int main()
{
int y;
y=change(12,34);
printf("%d",y);
return 0;
}
它有一個缺點。 我們不能在這個方法中傳遞參數
也許這會奏效:
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;
}
代碼很冗長,但很簡單。 如果有任何錯誤,請糾正我。
這是@Mooing Duck的答案的變體,它使用查找表為10的倍數(對於具有慢整數乘法的平台)它還返回無符號長long以允許更大的值並在查找表中使用unsigned long long來解釋@ chqrlie關於無限循環的評論。 如果可以保證組合輸入不超過無符號,則可以更改這些輸入。
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<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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.