Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;获取整数中的每个数字_C++ - Fatal编程技术网

C++ C++;获取整数中的每个数字

C++ C++;获取整数中的每个数字,c++,C++,我有一个整数: int iNums = 12476; 现在我想把iNums中的每个数字都作为整数。比如: foreach(iNum in iNums){ printf("%i-", iNum); } 所以输出是:“1-2-4-7-6-”。 但我实际上需要每个数字作为int而不是char 谢谢您的帮助。将其转换为字符串,然后迭代字符。对于转换,您可以使用std::ostringstream,例如: int iNums = 12476; std::ostringstream os; os

我有一个整数:

int iNums = 12476;
现在我想把iNums中的每个数字都作为整数。比如:

foreach(iNum in iNums){
   printf("%i-", iNum);
}
所以输出是:“1-2-4-7-6-”。 但我实际上需要每个数字作为int而不是char


谢谢您的帮助。

将其转换为字符串,然后迭代字符。对于转换,您可以使用
std::ostringstream
,例如:

int iNums = 12476;
std::ostringstream os;

os << iNums;
std::string digits = os.str();
int iNums=12476;
std::ostringstream os;

os我不测试它,只写我脑子里想的东西。请原谅任何语法错误

这是

向量v; int i=。。。。 而(i!=0){ cout
void打印每个数字(整数x)
{
如果(x>=10)
打印每个数字(x/10);
整数位数=x%10;

std::cout这里是一个更通用的递归解决方案,它生成一个数字向量:

void collect_digits(std::vector<int>& digits, unsigned long num) {
    if (num > 9) {
        collect_digits(digits, num / 10);
    }
    digits.push_back(num % 10);
}
void collect_位(std::vector&digits,unsigned long num){
如果(数值>9){
收集数字(数字,num/10);
}
数字。推回(数字%10);
}

由于存在相对较少的位数,因此递归是有界的。

根据D.Shawley的答案得出,可以通过输出结果进一步完全回答:

void stream_digits(std::ostream& output, int num, const std::string& delimiter = "")
{
    if (num) {
        stream_digits(output, num/10, delimiter);
        output << static_cast<char>('0' + (num % 10)) << delimiter;
    }
}

void splitDigits()
{
    int num = 12476;    
    stream_digits(std::cout, num, "-");    
    std::cout << std::endl;
}
void stream_位(std::ostream&output,int num,const std::string&delimiter=”“)
{
if(num){
流_位(输出,num/10,分隔符);

输出我不知道这是更快、更慢还是毫无价值,但这将是一个替代方案:

int iNums = 12476;
string numString;
stringstream ss;
ss << iNums;
numString = ss.str();
for (int i = 0; i < numString.length(); i++) {
    int myInt = static_cast<int>(numString[i] - '0'); // '0' = 48
    printf("%i-", myInt);
}
int iNums=12476;
字符串numString;
细流ss;

ss我知道这是一篇老文章,但所有这些答案都是我无法接受的,所以我写了自己的

我的目的是在屏幕上显示一个数字,从而得到函数名

void RenderNumber(int to_print)
{
    if (to_print < 0)
    {
        RenderMinusSign()
        RenderNumber(-to_print);
    }
    else
    {
        int digits = 1; // Assume if 0 is entered we want to print 0 (i.e. minimum of 1 digit)
        int max = 10;

        while (to_print >= max) // find how many digits the number is 
        {
            max *= 10;
            digits ++;
        }

        for (int i = 0; i < digits; i++) // loop through each digit
        {
            max /= 10;
            int num = to_print / max; // isolate first digit
            to_print -= num * max; // subtract first digit from number
            RenderDigit(num);
        }
    }
}
void RenderNumber(int到_打印)
{
如果(要打印<0)
{
RenderMinusSign()
RenderNumber(-to_print);
}
其他的
{
int digits=1;//假设输入了0,我们希望打印0(即至少1位)
int max=10;
while(to_print>=max)//查找数字的位数
{
最大*=10;
数字++;
}
for(int i=0;i
您可以使用此功能:

void printDigits(int number) {
    if (number < 0) { // Handling negative number
        printf('-');
        number *= -1;
    }
    if (number == 0) { // Handling zero
        printf('0');
    }
    while (number > 0) { // Printing the number
        printf("%d-", number % 10);
        number /= 10;
    }
}
int getDigit(int n, int position) {

    return (n%(int)pow(10, position) - (n % (int)pow(10, position-1))) / (int)pow(10, position-1);

}
void打印数字(整数){
if(number<0){//处理负数
printf('-');
数字*=-1;
}
如果(number==0){//处理零
printf('0');
}
当(数字>0){//打印数字时
printf(“%d-”,编号%10);
数目/=10;
}
}

基于@Abyx的答案,但使用
div
,因此每个数字只进行一次除法

#include <cstdlib>
#include <iostream>

void print_each_digit(int x)
{
    div_t q = div(x, 10);

    if (q.quot)
        print_each_digit(q.quot);

    std::cout << q.rem << '-';
}

int main()
{
    print_each_digit(12476);
    std::cout << std::endl;
    return 0;
}
注意:仅适用于非负整数。

在“位置”位置获取数字(从位置1开始作为最低有效位(LSD)):

示例:数字=57820-->位置=4-->位数=7


要按顺序获取数字,请执行以下操作:

int num_digits = floor( log10(abs(number?number:1)) + 1 );
for(; num_digits; num_digits--, number/=10) {
    std::cout << number % 10 << " ";
}
int num_digits=floor(log10(abs(数字?数字:1))+1);
对于(;num_位;num_位--,number/=10){
std::cout我的解决方案:

void getSumDigits(int n) {
    std::vector<int> int_to_vec;
    while(n>0)
    {
        int_to_vec.push_back(n%10);
        n=n/10;
    }

    int sum;

    for(int i=0;i<int_to_vec.size();i++)
    {
        sum+=int_to_vec.at(i);

    }
    std::cout << sum << ' ';
}
void getsumdights(int n){
std::向量int_到向量;
而(n>0)
{
内部到向量推回(n%10);
n=n/10;
}
整数和;

对于(int i=0;i我使用的答案是这个简单的函数:

void printDigits(int number) {
    if (number < 0) { // Handling negative number
        printf('-');
        number *= -1;
    }
    if (number == 0) { // Handling zero
        printf('0');
    }
    while (number > 0) { // Printing the number
        printf("%d-", number % 10);
        number /= 10;
    }
}
int getDigit(int n, int position) {

    return (n%(int)pow(10, position) - (n % (int)pow(10, position-1))) / (int)pow(10, position-1);

}

希望有人觉得这很有帮助!

以下是执行此操作的最简单方法

int num;
short temp = 0;
cin>>num;

while(num!=0){
    temp = num%10;
    
    //here you will get its element one by one
    //you can perform your action here.
    
    num /= 10;
}


这将按相反顺序打印每个数字。(-1)因为你得到的是7654321,而不是1-2-3-4-5-7。只是有点粗心,我的朋友们。不要这么苛刻。我宁愿使用
deque
推到前面
,然后使用
ostream\u迭代器
发送到cout。@Benoit谢谢你的评论。是的,有很多方法可以解决这个问题,我首先想到的是我改变了从数字到数字。+1:这是用C++解决这类问题的最通用/灵活的方法:学习这一点,你将为许多其他小任务做好准备。一旦你有了
数字
,你就可以迭代字符串,随心所欲地打印每个数字。可以打印,但我需要整数来处理它们。@Ilyssis,很公平,你在帖子中提到了这一点。我的错:-(别担心,我应该选一个更好的帖子标题。提前声明数字大小既乏味又不必要。谢谢,这正是我所需要的,因为我有一个固定的数字大小。或者,等一等,看看你是否能得到更好的答案。最快不一定最好。@AliEl sayedAli这太可怕了。使用
pow()
这是一个浮点数,用于计算整数本质上是不准确的。对于一些大整数,这可能会给出错误的结果。+1:你在递归解决方案上击败了我。我将把我的留在这里,但你先到了这里。注意,这段代码可能不会刷新cout流。更改
@Andreas.@Andreas还请阅读Can有人解释这段代码是如何工作的吗?递归总是让我感到困惑。你混合了有符号和无符号的数据类型。而且,你不必要地将算法限制在32位。对向量和num的数据类型使用无符号long-long可以解决这两个问题。@BenKey-当我写这篇C++11时,它还没有出现然而,
long-long
并不是标准的一部分。不过,您混合使用有符号和无符号是正确的。但是,请注意,尽管您的解决方案确实非常“简单”,但它也会以相反的顺序生成数字的组成位数。这可能是不可取的。
void getSumDigits(int n) {
    std::vector<int> int_to_vec;
    while(n>0)
    {
        int_to_vec.push_back(n%10);
        n=n/10;
    }

    int sum;

    for(int i=0;i<int_to_vec.size();i++)
    {
        sum+=int_to_vec.at(i);

    }
    std::cout << sum << ' ';
}
int getDigit(int n, int position) {

    return (n%(int)pow(10, position) - (n % (int)pow(10, position-1))) / (int)pow(10, position-1);

}
int num;
short temp = 0;
cin>>num;

while(num!=0){
    temp = num%10;
    
    //here you will get its element one by one
    //you can perform your action here.
    
    num /= 10;
}