【问题标题】:Finding how many a specific digit appears in array of numbers (C++)查找数字数组中出现了多少特定数字(C++)
【发布时间】:2013-03-02 10:22:42
【问题描述】:

我正在做一个在线挑战,挑战如下: “孩子们在玩一个叫做“数数”的游戏。对于给定的数字 S 和 K,他们首先在这些数字之间写下所有数字,然后计算每个数字出现的次数(0,1,2,3,4,5,6 ,7,8,9)。例如,S=767,K=772,数字将为:767,768,769,770,771,772

所以,0 将显示一次(在 770 中),1 将显示一次(在 771 中)等等..

基本上,我的程序必须执行以下操作(给定示例):

输入: 1 9 (这些是数字 1,2,3,4,5,6,7,8,9)

输出: 0 1 1 1 1 1 1 1 1 1 (0不显示,其他数字显示一次)。”

我被这段代码困住了......没有想法。

#include <iostream>

using namespace std;

int main()
{
    int s,k;
    int array[10];
    int c0=0,c1=0,c2=0,c3=0,c4=0,c5=0,c6=0,c7=0,c8=0,c9=0;
    cin >> s >> k;
    int saves = s;
    int savek = k;
    cout << s%10;
    for(int i=s;i<=k;i++)
    {
        int savei=i;
        while(savei!=0)
        {
            savei=savei%10;
        }
    }

感谢任何伪代码/sn-p/code/hint。

【问题讨论】:

  • 如果号码包含多个数字怎么办?例如 770 ?
  • 有两种方法可以做到这一点。一种是使用sprintf()将每个数字转换为字符串,然后统计字符串中的位数。另一种是使用除法和模数从数字中获取每个数字,并计算它们。无论哪种情况,您都需要一个数组 count[10] 来包含每个数字的计数器。
  • 顺便说一句,for 循环中的终止条件应该是 i&lt;=k,因为您的端点是包容性的。
  • while(val) {int dig = val % 10;val /= 10; /*用 dig 做事*/ }
  • @X-Factor 你在说什么?他不是想找到一个数字,而是想计算每个数字在一系列数字中使用了多少次。

标签: c++ arrays numbers digit


【解决方案1】:

纯数值问题的纯数值解:

#include <iostream>

int main()
{
    int s, k, i, tmp;
    std::cin >> s >> k;

    int count[10] = { 0 };

    for (i = s; i <= k; i++) {
        tmp = i;
        do {
            count[tmp % 10]++;
            tmp /= 10;
        } while(tmp);
    }

    for (i = 0; i < 10; i++) {
        std::cout << i << " appears " << count[i] << " times" << std::endl;
    }

    return 0;
}

【讨论】:

  • 有趣.. 基本上我也是这样。哦,又是你。我想问几个问题。什么是while(tmp)?我知道 tmp 是 i 的临时值,是不是意味着既然 0=false,只要 tmp(i) 的值不变成 0,它就会运行?我在您的示例中发现的另一个有趣的代码是 count[tmp%10],我不知道您可以在 [] 数组中进行数学运算。非常感谢!
  • @JohnSmith 当然可以,语法是递归的 :P 不,tmpi副本,因为tmp 正在被修改(基本上它通过数字的数字)。
  • 您总是让我感到惊讶,先生。这几天,我从你身上学到了很多。谢谢你。
  • 这是您的第一种编程语言吗?我不知道任何不允许将表达式放入数组索引中的通用语言。
  • @Barmar 是的,允许将正确的表达式用作索引而不只是常量是很常见的(因为它合乎逻辑且方便)(否则我们将很难实现/使用arr[i] ...)
【解决方案2】:

我的解决办法是这样的:

int main(){
    int s,k;
    cin >> s >> k;
    int numbers[10]={0};
    string sum;

    for(int i=s;i<=k;i++)
    {
        sum=to_string(i);
        for(int i=0;i<sum.length();i++){
            numbers[(int)sum.at(i)-48]++;
        }
    }

    for(int i=0;i<10;i++){
        cout<<numbers[i]<<endl;
    }

    return 0;
}

【讨论】:

  • 如果是这样,您可以在不转换字符串的情况下执行此操作。这是一道数学题,不能用字符串来解决。
  • for 循环是否也应该是 i
  • 好的。我修复了我的解决方案。我没有意识到 k 数字也在数组中。
  • 我喜欢你的解决方案,尽管正如 H2CO3 所说,这更像是一个数学问题。 :)
【解决方案3】:
public static void getDigitsInBook(int n) {
    for(int i=0;i<10;i++) {
        int x = n,val=0,k=1;
        while(x!=0) {
            int left  = x/10;
            int num = x%10;
            int right = n%k;
            if(i == 0) {
                val = val+ (left*k);
            }
            else if(i<num) {
                val = val + ((left+1)*k);
            }
            else if(i==num) {
                val = val + (left*k) + right+1;
            }
            else {
                val = val+ (left*k);
            }
            k=k*10;
            x = n/k;
        }
        System.out.println(val);
    }
}

【讨论】:

    【解决方案4】:

    您通常对此类任务执行的操作是计算0S 之间以及0K 之间的数字并减去这些数字。

    0767 之间有多少个?首先数最后一位的数字。有77 乘以0、1、2、3、4、5、6、7 和76 乘以8 和9。更正式地说,767/10+10767%10767/10+1 之间其余的部分。然后计算767/10=76的最后一位数字的出现次数,乘以10,加上7乘以7和6(最后一位的错误)并对剩余的数字做同样的事情,这里是@987654336 @。最后,将结果相加。

    这解决了O(log_10 K)中的问题。

    【讨论】:

      【解决方案5】:

      试试这个代码:

      for(int n=s ; n<=k ; n++)
      {
          tempN = abs(n);
          while(tempN > 0)
          {
              tempDigit = tempN % 10;
              tempN /= 10;
      
              //count tempDigit here
          }
      }
      

      假设您的变量是整数,“tempN /= 10;”应该没问题。

      【讨论】:

        猜你喜欢
        • 2021-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-08
        • 1970-01-01
        • 2021-09-10
        • 1970-01-01
        相关资源
        最近更新 更多