不使用字符串而是除以10

时间:2015-10-18 20:44:20

标签: c++ division digits

所以有一个挑战,你必须编写一个代码,将0-999之间的数字分成数字,而不使用字符串或除以10。我已经尝试了很多,无法提出完美的算法。我让我的代码工作分裂数字1-99但我真的认为有一些更好的选择而不使用111 if语句。好吧,所以这就是我得到的:

#include <iostream>

int main() {
    std::cout << "Enter a number ";
    int number;
    std::cin >> number;

    int cycles;
    if (number > 100) {
        cycles = 3;
    }
    else if (number > 10) {
        cycles = 2;
    }
    else {
        cycles = 1;
    }

    int digit[] = { -1, -1, -1 };
    for (int i = 0; i < cycles; i++) {
        if (number < 10) {
            digit[0] = number;
        }
        else if (number < 100) {
            if (number < 20) {
                digit[1] = number - 10;
                number = 1;
            }
            else if (number < 30) {
                digit[1] = number - 20;
                number = 2;
            }
            else if (number < 40) {
                digit[1] = number - 30;
                number = 3;
            }
            else if (number < 50) {
                digit[1] = number - 40;
                number = 4;
            }
            else if (number < 60) {
                digit[1] = number - 50;
                number = 5;
            }
            else if (number < 70) {
                digit[1] = number - 60;
                number = 6;
            }
            else if (number < 80) {
                digit[1] = number - 70;
                number = 7;
            }
            else if (number < 90) {
                digit[1] = number - 80;
                number = 8;
            }
            else {
                digit[1] = number - 90;
                number = 9;
            }
        }
        else if (number < 1000) {
            if (number < 200) {
                number -= 100;
            }
            else if (number < 300) {
                number -= 200;
            }
            else if (number < 400) {
                number -= 300;
            }
            else if (number < 500) {
                number -= 400;
            }
            else if (number < 600) {
                number -= 500;
            }
            else if (number < 700) {
                number -= 600;
            }
            else if (number < 800) {
                number -= 700;
            }
            else if (number < 900) {
                number -= 800;
            }
            else {
                number -= 900;
            }
        }
    }

    for (int i = 0; i < 3; i++) {
        if (digit[i] != -1) {
            std::cout << digit[i] << " ";
        }
    }
    std::cout << "\n";

    std::cout << "Press any key to exit... ";
    char i;
    std::cin >> i;
    return 0;
}

我被困住了,所以如果有人能够帮助我,那将非常感激!

5 个答案:

答案 0 :(得分:3)

基本上问题归结为如何在不使用除法运算符的情况下实现除法运算符。由于存在相当有限的可能性,即,当测试每个数字时,只有10个可能的结果0-9,一个简单的解决方案是通过所有这些结果。您可以为每个使用乘法,但稍微快一点就是迭代可能的答案。所以一个简单的函数,它取基数(1,10或100)和你分开的数字将是

int getDigit(int base, int number) {
  int digit = 0;
  for (int i = base;i <= number;i += base) ++digit;
  return digit;
}

此功能仅在数字&lt; 10 *碱。所以你需要从最大的数字开始。然后从数字中减去base *数字并重复,直到你完成所有数字。

答案 1 :(得分:2)

使用两个循环,一个循环从最高到最低的占位符,以及一个从值中减去直到值小于该位置的内循环,有效地分割而不使用除法运算符。类似的东西:

int number;
int subtractionvalue;
int[3] placevalues;
for(int thisvalue=2;thisvalue>=0;thisvalue--){
    subtractionvalue=round(pow((double)10,thisvalue));
    while(number>=subtractionvalue){
        number=number-subtractionvalue;
        placevalues[thisvalue]++;
    }
}

placevalues数组将包含您的解决方案。

答案 2 :(得分:1)

由于你不能除以10,你可以使用等于除以10的移位算子,见here

使用移位运算符除以10:

答:我们的整数 问:商

Q = ((A >>  1) + A) >> 1; 
Q = ((Q >>  4) + Q)     ; 
Q = ((Q >>  8) + Q)     ; 
Q = ((Q >> 16) + Q) >> 3; 
/* either Q = A/10 or Q+1 = A/10 for all 32-bit unsigned A */

其余部分:

R=A-10*Q;

我们可以使用while循环扩展此方法,因为我们知道我们的整数小于999,我们可以采用数组[3]:

#include<stdio.h>
#include<stdlib.h> 
int main()
{
    int A=123;
    int R=A;
    int Q=123; /* the quotient */

    Q = ((A >>  1) + A) >> 1;

    int ar[3]={0},i=2;

    //loop for getting all digits
    while(Q>10)
    {
       Q = ((Q >>  4) + Q)     ;
       Q = ((Q >>  8) + Q)     ;
       Q = ((Q >> 16) + Q) >> 3;
       //storing ramainder in array in reverse
       ar[i--]=R-10*Q;
       R=Q;
    }
    ar[i]=Q;
    for(i=0;i<3;i++)
      printf("%d ",ar[i]);
    return 0; 
}

答案 3 :(得分:1)

我可能会忽略这一点,并且用我的C#裸露出来,但不算蜂是最容易的?

static void Main(string[] args)
{
  int number = 592;
  int digit1 = 0;
  int digit2 = 0;
  int digit3 = 0;
  for (int c = 0; c < number; c++)
  {
    digit1 += 1;
    if (digit1 == 10)
    {
      digit2 += 1;
      digit1 = 0;
    }
    if(digit2 == 10)
    {
      digit3 += 1;
      digit2 = 0;
    }
  }
  Console.WriteLine(digit1);
  Console.WriteLine(digit2);
  Console.WriteLine(digit3);
}

C ++版本:

int main()
{
  std::cout << "Enter a number ";
  int number;
  std::cin >> number;
  int digit1 = -1;
  int digit2 = -1;
  int digit3 = -1;
  for (int c = 0; c < number; c++)
  {
    digit1 += 1;
    if (digit1 == 10)
    {
      digit2 += 1;
      digit1 = 0;
    }
    if (digit2 == 10)
    {
      digit3 += 1;
      digit2 = 0;
    }
  }
  if (digit3 > -1) {
    std::cout << digit3+1 << " ";
  }
  if (digit2 > -1) {
    std::cout << digit2+1 << " ";
  }
  if (digit1 > -1) {
    std::cout << digit1+1 << " ";
  }
  std::cout << "\n";

  std::cout << "Press any key to exit... ";
  char i;
  std::cin >> i;
  return 0;
}

答案 4 :(得分:1)

一种方法是将整数转换为定点格式,该格式提供能够保存一个十进制数字的整数部分,并使用小数部分的其余位。例如,当使用32位int时,我们可以为整数分配4个最高有效位,为分数分配28个最低有效位。

原始数字首先转换为纯分数,在这种情况下除以1000.然后乘以比例因子2 28 。为简单起见,下面的代码使用浮点运算进行此计算,但是如果需要,也可以使用整数运算来完成。由于浮点数转换为整数类型在C ++中是截断的,因此ceil()用于略微提高定点数。

一旦我们转换为定点格式,我们现在可以通过将定点数乘以10来提取每个十进制数字,将产品的整数部分提取为下一个十进制数字,然后丢弃整数部分定点结果。

我为下面的程序保留了尽可能多的原始代码。

#include <iostream>
#include <cmath>

int main() {
    std::cout << "Enter a number ";
    int number;
    std::cin >> number;
    int digit[] = { -1, -1, -1 };

    unsigned int t, dec_digit;
    bool have_seen_nonzero;

    t = ceil (number / 1e3 * (1 << 28)); // 4.28 fixed-point representation
    for (int pos = 0; pos < 3; pos++) {
        t = t * 10;            
        dec_digit = t >> 28; // extract integer portion of fixed-point number
        t = t & 0x0fffffff; // discard integer portion of fixed-point number
        have_seen_nonzero = dec_digit != 0;
        if (have_seen_nonzero) digit[pos] = dec_digit;
    }

    for (int i = 0; i < 3; i++) {
        if (digit[i] != -1) {
            std::cout << digit[i] << " ";
        }
    }
    std::cout << "\n";

    std::cout << "Press any key to exit... ";
    char i;
    std::cin >> i;
    return 0;
}