如何在C中隔行两个整数?

  • 本文关键字:两个 整数 隔行 c math
  • 更新时间 :
  • 英文 :


假设我有两个整数

a = 1234b = 45678

现在我想要&;interlace&;它们进入第三个c,看起来像这样c = 415263748假设它们的长度不变。到目前为止,我已经能够这样做了:

unsigned interlace(unsigned x, unsigned y) {
unsigned pow = 10;
while(y >= pow)
pow *= 10;
return x * pow + y;        
} 

你必须一个一个地得到数字。当你说x % 10时,你得到的是最低有效数字。当你说x = x /10时,你去掉了最低有效数字。从y开始,然后保持交替:

unsigned interlace(unsigned x, unsigned y)
{
//If the parameters order could be inverted...
if(x > y)
{
unsigned z = x;
x = y;
y = z;
}
unsigned ans = y % 10;
y = y/10;
unsigned exponent = 10;
while(y)
{
ans += (x%10)*exponent;
x = x/10;
exponent *= 10;
ans += (y%10)*exponent;
y = y/10;
exponent *= 10;
}
return ans;
}

稍微改变一下方法可以通过处理值的字符串表示的交错来消除参数顺序问题。这允许一个简单的方法将两个数字缝在一起。虽然这里使用strlen(),但您也可以使用snprintf (NULL, 0, "%u", a)snprintf (NULL, 0, "%u", b)来确定每个数字的位数。

一个简单的方法是:

#define NUMC 32
unsigned interlace (unsigned a, unsigned b)
{
char sa[NUMC], sb[NUMC], result[2*NUMC];
size_t lena, lenb, n = 0;

sprintf (sa, "%u", a);
sprintf (sb, "%u", b);

lena = strlen(sa);
lenb = strlen(sb);

if (lena > lenb) {
for (size_t i = 0, j = 0; sa[i]; i++) {
result[n++] = sa[i];
if (sb[j])
result[n++] = sb[j++];
}
result[n] = 0;

return (unsigned)strtoul (result, NULL, 0);
}

for (size_t i = 0, j = 0; sb[i]; i++) {
result[n++] = sb[i];
if (sa[j])
result[n++] = sa[j++];
}
result[n] = 0;

return (unsigned)strtoul (result, NULL, 0);
}

(注意:转换和长度检查大于零的验证应该添加在上面。为了简洁,我们特意省略了它们

参数的顺序是无关的。您可以将其称为interlace (a, b)interlace (b, a),每次结果都是正确的。

一个简短的例子:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUMC 32
unsigned interlace (unsigned a, unsigned b)
{
char sa[NUMC], sb[NUMC], result[2*NUMC];
size_t lena, lenb, n = 0;

sprintf (sa, "%u", a);
sprintf (sb, "%u", b);

lena = strlen(sa);
lenb = strlen(sb);

if (lena > lenb) {
for (size_t i = 0, j = 0; sa[i]; i++) {
result[n++] = sa[i];
if (sb[j])
result[n++] = sb[j++];
}
result[n] = 0;

return (unsigned)strtoul (result, NULL, 0);
}

for (size_t i = 0, j = 0; sb[i]; i++) {
result[n++] = sb[i];
if (sa[j])
result[n++] = sa[j++];
}
result[n] = 0;

return (unsigned)strtoul (result, NULL, 0);
}
int main (void) {

unsigned a = 1234, b = 45678;

printf ("interlaced: %un", interlace (a, b));
}

使用/输出示例

$ ./bin/interlace_int
interlaced: 415263748

另一种完全不同的方法,与您的原始方法更内联,可以使用div函数和div_t结构体自动处理除法和余数。您可以使用snprintf (NULL, 0, "%u", var);函数来确定位数,以便在必要时交换参数。

一个简短的例子是:

#include <stdio.h>
#include <stdlib.h>
unsigned interlace (unsigned a, unsigned b)
{
unsigned result = 0, mult = 1;
div_t da = { .quot = a }, db = { .quot = b };

if (snprintf (NULL, 0, "%u", b) > snprintf (NULL, 0, "%u", a)) {
div_t tmp = da;
da = db;
db = tmp;
}

do {
da = div (da.quot, 10);
result += da.rem * mult;
mult *= 10;

if (db.quot) {
db = div (db.quot, 10);
result += db.rem * mult;
mult *= 10;
}
} while (da.quot);

return result;
}
int main (void) {

unsigned a = 1234, b = 45678;

printf ("interlaced: %un", interlace (a, b));
}

(注意:这里,参数的顺序是无关的,你可以以任何顺序提供ab,仍然得到正确的结果)

使用/输出示例

$ ./bin/interlace_unsinged
interlaced: 415263748
如果你还有问题,请告诉我。这是另一种给隔行猫去皮的方法。

这不是你想要的,但也许你可以在你的函数中重用一些逻辑....


输出:

Interlace 2 numbers as a printf
Enter number a: forty-three
Insert digit  : 1234
Enter number b: 45678
Interlaced numbers: 142536478

代码:

#include <stdio.h>
int main(void){
long int num , num2, temp , factor = 1, factor2 = 1;
puts("Interlace 2 numbers as a printf");
printf("Enter number a: ");
while(!scanf(" %ld",&num)){
while ((temp = getchar()) != 'n' && temp != EOF);
printf("Insert digit  : ");
}
printf("Enter number b: ");
while(!scanf(" %ld",&num2)){
while ((temp = getchar()) != 'n' && temp != EOF);
printf("Insert digit  : ");
}
temp = num;
while(temp){
temp   /= 10;
factor *= 10;
}
temp = num2;
while(temp){
temp    /= 10;
factor2 *= 10;
}       
printf("Interlaced numbers: ");
while(factor>1)
{
factor /= 10;
printf("%ld",num/factor);
num %= factor;
if (factor2 > 1)
{
factor2 /= 10;
printf("%ld",num2/factor2);
num2 %= factor2;
}
}
while(factor2>1)
{
factor2 /= 10;
printf("%ld",num2/factor2);
num2 %= factor2;
}
putchar('n');
return 0;
}
#include <stdio.h>
#include <math.h>
int main(void) {
int a = 1234;
int b = 45678;
int c = 0;

while(a || b)
{
if (b)
{
int m = pow(10, (int)log10(b)); 
c=c*10 + b/m;
b = b%m;
}
if (a)
{
int m = pow(10, (int)log10(a)); 
c=c*10+a/m;
a = a%m;
}
}
printf("Result: %dn", c);
return 0;
}
输出:

Success #stdin #stdout 0s 4692KB
Result: 415263748

IDEOne联系

将这两个数字的最后一位附加到n * 10(重复操作),得到与隔行相反的结果。只是为了帮助,如果你被困在生成反向交错。

unsigned interlace (unsigned x, unsigned y)
{
unsigned n, r;
if( x > y)
{
temp = x;
x = y;
y = temp;
}
n = y % 10;
y = y / 10;

while (x || y) // To Generate reverse of the interlace
{
n = n * 10 + (x % 10);
x /= 10;

n = n * 10 + (y % 10);
y /= 10;
}

r = n % 10;
n = n / 10;
while(n != 0) // reverse it to get the interlaced number
{
r = r * 10 + (n % 10);
n /= 10;
}
return r;
}

最新更新