C++ 数组转数字

Posted

技术标签:

【中文标题】C++ 数组转数字【英文标题】:C++ Array to a number 【发布时间】:2020-11-02 14:20:23 【问题描述】:

我不知道如何编写从数组中获取数字并将它们等于没有0 的整数的代码。

例如,我有一个数组A[size]= 12,68,45,20,10,我需要得到n= 12684521 的答案。任何想法或提示如何制作它?

【问题讨论】:

1.将所有数字放入std::stringstream 2. 获取连接字符串 3. 通过std::remove_if 删除零 4. 如果需要,将过滤后的字符串转换为整数 @MikeCAT 使用std::to_string 会比std::ostringstream 简单,而std::stringerase_if 我是编程初学者,所以我尝试使用这段代码,它只给出了数字的总和 int integer(int A[],int k) int a=0,temp=0; for(int i=0;i 【参考方案1】:

不使用字符串或字符串流也可以做到这一点。代码如下:

int integer(int* arr, size_t length)

    int result = 0;
    for (size_t i = 0; i < length; i++)
    
        int t1 = arr[i], t2 = 0;
        while (t1 != 0)
        
            if(t1 % 10 != 0)
            
                t2 *= 10;
                t2 += t1 % 10;
            
            t1 /= 10;
        
        while (t2 != 0)
        
            if(t2 % 10 != 0)
            
                result *= 10;
                result += t2 % 10;
            
            t2 /= 10;
        
    
    return result;

奇怪的是创建两个内部 while 循环,因为其中一个循环中的操作反映了数字(例如,如果 arr[i] 为 68,则 t2 变为 86,然后将 6 和 8 附加到 result)。

【讨论】:

数字是要乘以10还是乘以100?我的理解是乘以 10 会将数字移动一个 单个 数字。 @Thomas 数字乘以 10,因为此代码一个接一个地移动数字(例如:, , , )。然而,数字是相反的,这就是为什么有两个循环。【参考方案2】:

我会这样做:

#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#define size 5

int main() 
  std::string ret;
  
  //your array
  int a[size]=12,68,45,20,10;
  //transform to string
  std::ostringstream out; 
  for(int i=0;i<size;i++)out << a[i];
  ret = out.str();
  //transform
  ret.erase(remove(ret.begin(), ret.end(), '0'), ret.end());
  //return string
  std::cout << ret;
  //return number
  int ret2 = std::stoi (ret);
  std::cout << ret2;

控制台:“12684521”

【讨论】:

我真的不建议新开发者使用不带大括号的 for 循环。一个新的开发者会在某个时候把它变成一个错误。此外,对于新手来说,转换线的解析非常复杂。另外我认为他希望返回类型是整数 ret.erase(remove(ret.begin(), ret.end(), '0'), ret.end());有人能解释一下这条线是如何工作的吗,因为它对我来说看起来很复杂,因为我是“新鲜的”一个月前才开始编程 c++ 我也编辑返回一个整数,David remove 得到了 3 个参数,第一个是开始第二个是删除结束第三个是要删除的术语 我添加了一些关于擦除删除成语@David的附加信息 有没有办法在这里给你代表或感谢你,伙计?【参考方案3】:

正如其他人提到的,您想要使用流式传输对象,或者如果您使用的是 C++20,您想要使用 remove_if。

您可能想检查一下。您需要知道如何使用流才能成为开发人员。 What exactly does stringstream do?

使用@MikeCAT方式

size_t concatArrrayNoZero(int[] a, size_t len)
  std::stringstream ss;
  for( auto i : a)
    //add everything to buffer    
    ss<<i;
  
  //convert the ss into a string
  std::string str = ss.str();
  //remove the '0' from the string then erase the extra space in the string
  str.erase(std::remove(str.begin(), str.end(), '0'),
               str.end());
  //clear the buffer
  ss.clear();
  //put the nonzeros back into the buffer
  ss<<str;
  //make the return type
  size_t r;
  // get the data out of the buffer
  r<<ss;
  return r;

size_t 是您计算机的最大无符号整数类型。

还可以查看 https://en.wikipedia.org/wiki/Erase%E2%80%93remove_idiom 了解为什么要擦除和删除

【讨论】:

以上是关于C++ 数组转数字的主要内容,如果未能解决你的问题,请参考以下文章

c++字符串如何转化为数字?

C++中怎么把字符串string型的数字转换成整型int型的数字?

c++ 生成随机字符串转

c++ string int

C++中数字转ascii码函数

c++ 字符串转数字