将数字列表转为一个整数

0 投票
5 回答
787 浏览
提问于 2025-04-18 02:46

我想要输入一个整数,去掉这个整数里面所有的奇数数字,然后返回这个新的整数。不能使用内置函数。我到目前为止的做法是把它变成了一个列表,但我需要它输出一个整数。

def rem_odd(integer):
    x = []
    while integer > 0:
        if integer % 2 == 0:
            x = [(integer % 10)] + x
            integer = integer / 10
        else:
            integer = integer / 10
    return x

5 个回答

0

整数可以拆分成每个数字乘以10的不同次方。

比如说:

  • 24 = 2 * 10 + 4
  • 256 = 2 * 100 + 5 * 10 + 6

你可以通过列表中数字的位置来确定当前的10的次方:

def getInt(lst):
    res = 0
    pow = len(lst) - 1

    for el in lst:
        res += el * (10 ** pow)
        pow -= 1

return res

现在调用 >>> getInt([2,4,8]) 会返回:248

如果不使用内置的len函数,想要获取列表的长度其实也很简单,因为你可以用递归的方法来实现。

0

如果你不能使用像 int() 或 join() 这样的内置函数,你可以这样做:

def rem_odd(integer):
    x = []
    while integer > 0:
        if integer % 2 == 0:
            x = [(integer % 10)] + x
            integer = integer / 10
        else:
            integer = integer / 10
    res = 0
    digits = len(x)
    for i in range(digits):
        res += x[i] * (10**(digits-i-1))

    return res
1

由于这里其他的回答都没有严格遵循“不能使用内置函数”的要求,我提供了一个扩展的Python代码,供提问者使用:

/* rem_odd.c */
#include <Python.h>                                                         
#include <math.h>                                                           

static PyObject *                                                           
rem_odd(PyObject *self, PyObject *args)                                     
{ 
    int digit, ix, n, num, result;                                          
    int digits[20];  /* handles up to 2^64 (20 digits) */                   
    if (!PyArg_ParseTuple(args, "i", &num))                                 
        return NULL;                                                        
    n = num;                                                                
    ix = 0;                                                                 
    while (n > 0) {                                                         
        digit = n % 10;                                                     
        n /= 10;                                                            
        if (digit % 2 == 0)                                                 
            digits[ix++] = digit;                                           
    }
    result = 0;                                                             
    while (ix-- >= 0) {                                                     
        result += (int)(pow(10., ix)) * digits[ix];                         
    }                                                                       
    return Py_BuildValue("i", result);                                      
}                                                                           


static PyMethodDef RemOddMethods[] = {                                      
    {"rem_odd", rem_odd, METH_VARARGS,                                      
    "Remove odd digits from an integer and return another integer."},       
    {NULL, NULL, 0, NULL}                                                   
};


PyMODINIT_FUNC                                                              
initrem_odd(void)                                                           
{                                                                           
    (void) Py_InitModule("rem_odd", RemOddMethods);                         
}

接下来使用 distutils

from distutils.core import setup, Extension                                 

rem_odd_module = Extension('rem_odd',                                       
                            sources = ['rem_odd.c'])                        

setup(name='rem_odd', version='1.0',                                        
    description='Remove odd digits from integers -- NO BUILTINS',           
    ext_modules = [rem_odd_module])                                         

示例用法(在运行 setup.py buildsetup.py install 之后):

Python 2.7.6 (default, Feb 26 2014, 12:01:28) 
[GCC 4.8.2 20140206 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from rem_odd import rem_odd
>>> rem_odd(203)
20
>>> rem_odd(9684684)
684684
>>> rem_odd(123456789)
2468
1

根据对“内置函数”的宽松理解:

def rem_odd(integer):
    return int(''.join(x for x in str(integer) if not x in '13579'))

如果我们对内置函数的定义更严格一些:

def rem_odd(integer):
    r = 0
    mult = 1
    while integer > 0:
        if integer % 2 == 0:
            r = r + mult * (integer % 10)
        integer = integer // 10
        mult *= 10
    return r

~

5

假设你用 203 作为参数来调用你的函数:

x = rem_odd(203)

你得到的结果是 x = [2, 0]

接下来你要做的是:

>>> x = [2, 0]
>>> x = [str(a) for a in x]
>>> x
['2', '0']
>>> int(''.join(x))
20
>>>

上面的做法是通过字符串操作来解决问题。如果不使用内置函数,数学上的解决方案是:

>>> x = rem_odd(203)
>>> p = y = 0
>>> for i in x[::-1]:
...     y += i * (10 ** p)
...     p += 1
...
>>> y
20

你从列表的右边开始遍历,也就是从个位数开始,一直到最高的十的幂,然后把每个数字乘以 10 的指数次方。

撰写回答