【问题标题】:Identify the digits in a given number.识别给定数字中的数字。
【发布时间】:2010-11-02 03:25:34
【问题描述】:

我是编程新手,但遇到了一个问题。我希望我的程序识别给定数字中的单独数字,例如如果我输入4692,它应该识别数字并打印4 6 9 2。是的,不使用数组。

【问题讨论】:

  • 很好的面试问题。谢谢!

标签: c++ c numbers digits


【解决方案1】:

如果您是编程新手,可以解决一个完美的递归问题...

4692/1000 = 4

4692%1000 = 692

692/100 = 6

692%100 = 92

92/10 = 9

92%10 = 2

您应该了解现在应该使用的循环,以便它适用于任何数字。 :)

【讨论】:

  • 4692%1000 = 692,不是 2。4692/1000 = 4,不是 469。
  • 是的,+1 你的答案很好,因为它会导致答案,而不仅仅是解决家庭作业,但请更正你的数字!
  • 打字太快的问题,是我有时打字的速度比我想象的要快。 ;) 更正!
【解决方案2】:

一年没写过 C 代码,但这应该可以。

int i = 12345;

while( i > 0 ){
   int nextVal = i % 10;
   printf( "%d", nextVal );
   i = i / 10;
}

【讨论】:

  • 这是完全错误的。您将 i 的值打印 5 次:“123451234123121”。即使您打印nextVal 而不是i,您的操作顺序也错误,并且会打印“54321”。
  • 您应该将结果存储到一个字符串中并在打印之前将其反转。你也可以使用堆栈来反转
  • @Babak Naffas 的回答是一个相当简单但典型的解决方案。但如果您想要更快的速度,您可以尝试double dabble 将数字拆分为 BCD。之后,很容易取出每个数字并打印出来。
【解决方案3】:

简单又好看

void PrintDigits(const long n)
{
    int m = -1;
    int i = 1;

    while(true)
    {
        m = (n%(10*i))/i;
        i*= 10;
        cout << m << endl;

        if (0 == n/i)
            break;
    }
}

【讨论】:

  • 仅适用于非负数。
【解决方案4】:

另一种方法是有两个循环。

1) 第一个循环:倒数。

int j = 0;
while( i ) {
   j *= 10;
   j += i % 10;
   i /= 10;
}

2) 第二个循环:从右到左打印数字。

while( j ) {
   std::cout << j % 10 << ' ';
   j /= 10;
}

这是假设您希望从右到左打印数字。我注意到这里有几个解决方案没有这个假设。如果没有,那么只需第二个循环就足够了。

【讨论】:

  • 注意,如果i 以零结尾,则第 1 部分会中断,因为 j 会在开头保持为零,将其乘以 10 不会对其产生任何影响。
【解决方案5】:

我认为这个想法是打印非重复数字(否则会太简单)...好吧,您可以跟踪已经打印的整数,而无需将数组编码为另一个整数。

一些伪C,给你一个线索:

int encoding = 0;
int d;

while (keep_looking()) {
  d = get_digit();
  if (encoding/(2**d)%2 == 0) {
    print(d);
    encoding += 2**d;
  }
}

【讨论】:

  • 什么是d**2?我想你的意思是d*d
  • 如果我没记错的话,** 是 Fortran 的幂运算符。 C 没有幂运算符。您可以将2**d 替换为1 &lt;&lt; d
  • 这就是我说“伪-c”的原因,我不想让新手接触位移和掩码操作(%2 也与 &1 相同),这就是我限制自己的原因算术运算。
【解决方案6】:

如果您只想打印数字中的数字,这是一个简单的解决方案。

#include <stdio.h>
/**
printdigits
*/
void printDigits(int num) {

   char buff[128] = "";
   sprintf(buff, "%d ", num);
   int i = 0;
   while (buff[i] != '\0') {
      printf("%c ", buff[i]);
      i++;
   }
   printf("\n");
}
/*
main function
*/
int main(int argc, char** argv) {
   int digits = 4321;
   printDigits(digits);
   return 0;
}

【讨论】:

  • 打印整数不需要 128 个字符。另外,如果您稍后要用sprintf() 覆盖它,为什么还要初始化buff?另外,如果你从不使用char *p,为什么还要使用它?
  • 是的,早些时候我打算使用指针进行迭代,所以我有 char *p。关于尺寸,他没有提到数字的长度,所以为了安全起见,使用了 128。
  • int 在大多数平台上最多只能容纳 40 亿个数字,因此使用 10 位数字(11 个带有 nul 终止符的字符)应该是安全的。如果您担心 64 位,那仍然只有大约 20 到 25 个字符。
  • 他说“不使用数组”
【解决方案7】:

对吗

int main()        
{
    int number;
    cin>>number;
    int nod=0;
    int same=number;

    while(same){
        same/=10;
        nod++;
    }

    while(nod--){               
        cout<<(int)number/(int)pow10(nod)%10<<"\t";       
    }
    return 0;
}

【讨论】:

  • 不完全理解逻辑
猜你喜欢
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 2018-09-08
  • 2023-04-05
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
  • 2021-04-16
相关资源
最近更新 更多