#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。 :如果有人可以提供其他解决方案,这将很有帮助。我仍然是新手,因此可以帮助我更深入地了解事物。
答案 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;
}