簡體   English   中英

如何在C中連接兩個整數

[英]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;        
}

編譯/正確性/速度證明

我避免使用log10pow函數,因為我很確定它們使用浮點並且速度很慢,所以在你的機器上這可能會更快。 也許。 輪廓。

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_MININT_MAX ),則發生錯誤。 INT_MININT_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM