查找数字中最大位数的频率

时间:2019-06-01 09:31:21

标签: c loops

#include <stdio.h>

int main(void)
{
    int i=0,max=0;
    long long int n,p;
    scanf("%lld",&n);
    while(n>0)
    {
        p=n%10;
        if(p==max)
        {
            i++;
        }
        else if(p>max)
        {
            max=p;
            i=1;
        }
        n/=10;
    }
    printf("%d",i);
    return 0;
}

该代码可为 8687557576676885 之类的数字提供正确的结果。但是对于输入 11111111111111111111111111111111 ,它不能给出正确的结果。我在这个网站上看到过类似的问题,但是这些问题是用不同的语言编写的。我想知道问题出在哪里。

谢谢...

N.B。 :如果有人可以提供其他解决方案,这将很有帮助。我仍然是新手,因此可以帮助我更深入地了解事物。

2 个答案:

答案 0 :(得分:1)

  

该代码可为诸如8687557576676885之类的数字给出正确的结果。但是对于输入11111111111111111111111111111111

8687557576676885 需要53位,但是 11111111111111111111111111111111111 需要104位,对于您的 long long 来说可能太多,可能需要64位

  

如果有人可以提供替代解决方案,这将是有帮助的

而不是使用 scanf 而不是使用 fgets 或等效的方法,然后使用 strtoll ,您将能够通过查看 errno来检测溢出。

但是,在您的情况下,您无需提取数字,只需处理字符串即可,例如,不受任何大小限制:

#include <stdio.h>

int main(void)
{
  int i=0,max=-1;
  int c;

  while ((c = fgetc(stdin)) && (c != EOF) && (c != '\n')) {
    if ((c < '0') || (c > '9')) {
      printf("'%c' is not a valid digit\n", c);
      return -1;
    }
    c -= '0';
    if(c==max)
    {
      i++;
    }
    else if(c>max)
    {
      max=c;
      i=1;
    }
  }
  if (max != -1)
    printf("%d times %d\n",i, max);
  return 0;
}

编译和执行:

pi@raspberrypi:/tmp $ gcc -pedantic -Wall -Wextra m.c
pi@raspberrypi:/tmp $ ./a.out
8687557576676885
4 times 8
pi@raspberrypi:/tmp $ ./a.out
111111111111111111111111111111111111111111
42 times 1

答案 1 :(得分:1)

您的代码中有一个溢出。我打印了scanf读取的值,结果是这样的:

11111111111111111111111111111111
7 0 922337203685477580
0 7 92233720368547758
8 7 9223372036854775
5 8 922337203685477
7 8 92233720368547
7 8 9223372036854
4 8 922337203685
5 8 92233720368
8 8 9223372036
6 8 922337203
3 8 92233720
0 8 9223372
2 8 922337
7 8 92233
3 8 9223
3 8 922
2 8 92
2 8 9
9 8 0
9 1

我使用了此修改后的代码:

#include <stdio.h>

int main(void)
{
  int count=0,max=0, digit;
  long long int n;
  scanf("%lld",&n);
  while(n)
  {
    digit=n%10,n/=10;
    printf("%d %d %lld\n",digit, max, n);
    if(digit==max)
      count++;
    else if(digit>max)
      max=digit,
      count=1;
  }
  printf("%d %d",max, count);
  return 0;
}

为了避免溢出,您需要将数字读取为字符串char*number,并将数字视为字符。您应该这样做:

int main(void)
{
  int count=0;
  char max='0', digit;
  char n[1000], *p=n;
  fgets(n, 1000, stdin);
  while(*p)
    {
      digit=*p++;
      if(digit==max)
        count++;
      else if(digit>max)
        max=digit,
        count=1;
    }
  printf("%c %d",max, count);
  return 0;
}