1

该程序为我们提供了给定整数中奇数的位置,该程序运行良好,但是当我给他一个大于 10 的整数时,例如 123456789123-,它不起作用。不知道是内存问题还是算法问题?

#include<stdio.h>
#include<stdlib.h>

main(){

    int a,b;
    int i = 0;

    scanf("%d",&a);

    while(a/10!=0){
        b=a%10;
        if(b%2!=0)
            printf("\nodd number position: %d",i);
        a=a/10;
        i++;
    }

    if(a%2!=0)
        printf("\nodd number position: %d",i);

    system("pause");
}
4

8 回答 8

3

问题是处理器(架构)而不是 RAM 之一。在您的平台上,an 的大小int似乎是 32 位,不能容纳像 123456789123 这样大的数字。正如 Groo 对 Raon 的评论,您可以改用字符串(如果您不打算对数字进行任何计算):

char a[1024] = {0}; /* should be plenty, but extend the array even more if needed */

fgets(a, sizeof a, stdin); /* fgets is recommended as it doesn't overflow */

int i, length = strlen(a);

for(i = 0; i < length; i++){
    /* count your odd digits here
       left as an exercise to the reader */
    /* note that you must access the individual digits using a[i] */
}
于 2013-10-24T11:08:46.283 回答
1
#include<stdio.h>

void main() {

    int i;
    char s[256];

    scanf("%s",s);

    for( i=0; s[i]!=0; ++i ) {
        /*int digit = s[i]-48;
        if( digit%2==1 ) break;
        - or even shorter: */
        if( s[i]%2==1 ) break;
    }

    if( s[i]!=0 )
        printf( "First odd digit position: %d", i );
    else
        printf( "All digits are even" );
}

这是工作示例:http ://cfiddle.net/sempyi

于 2013-10-24T11:09:52.410 回答
1

每种数据类型都限制在特定范围内。例如char,限制在范围内-128 to 128。如果您使用超出此范围。你可能会得到意想不到的结果。

在你的程序中,如果你给出任何超出整数范围的数字,那么你会得到意想不到的结果

如果您的 int 大小为 4 字节/32 位,您可以在此范围内提供输入–2,147,483,648 to 2,147,483,647

如果您的 int 大小为 2 字节/16 位,您可以在此范围内提供输入–32,768 to 32,767

检查此数据类型范围

如果你想给大数字你可以声明变量为long int/long long int 并且不要忘记在使用long int(%ld)和时更改格式说明符long long int(%lld)

isdigit()您还可以使用字符串并通过在标题中使用函数来检查所有字符是否不是数字,ctype.h并通过减去 '0' 将字符数字转换为整数数字(character zero)。并检查是否奇怪。

于 2013-10-24T11:13:16.427 回答
1

问题是 123456789123 超出了整数数据类型的存储限制,尝试使用字符串存储值并解析它,例如

#include<stdio.h>
int main(){
    char a[] = "12345678912345678913246798";
    int i = 0;
    for (i=0; a[i] != '\0'; i++){
        if ( a[i] % 2 != 0 ) printf("%c is odd\n", a[i]);
    }
    return 0;
}
于 2013-10-24T11:24:34.837 回答
0

1234567891230x1CBE991A83 如果 int 是 32 位,那么您的号码会被截断(到或31977048350xBE991A83

于 2013-10-24T11:01:39.720 回答
0

如果您给出的数字超过 10 位,我认为该程序将无法给出正确的答案!如果我错了,请纠正我。最大无符号整数值为 4294967295(在任何 32 位处理器中)。如果给定值大于该值,则它将限制为该最大值或发生溢出。因此,如果您给出一个大于 4294967295 的整数,它将无法正常工作。

尝试打印输入。在这种情况下,您将知道是发送完整号码还是发送最大号码以查找奇数的位置。

使其工作的一种方法是将输入数字读取为字符数组,然后尝试找出奇数位置。

注意:有符号整数最大值为 2147483647

于 2013-10-24T11:05:02.850 回答
0

您输入的数字大于 int 的范围。您需要更改数据类型下面的链接应该对您有所帮助。

http://www.tutorialspoint.com/ansi_c/c_basic_datatypes.htm

于 2013-10-24T11:08:24.560 回答
0

您需要选择与预期数据范围相匹配的数据类型。

如果您希望您的程序适用于任何数字,最好一次读取第一个字符。

代码(不是在此代码中,位置以最高有效数字 = 1 计算,与您的代码相比,这是另一个方向):

  int c;
  unsigned long long pos = 0;
  while (++pos) {
    c = getc();
    if (c < '0' || c > '9') break; // Not a digit
    if ((c - '0')%2 != 0) {
            printf("\nodd number position: %ulld", pos);
    }
  }

该代码可以处理具有大量数字的数字。不过,最终pos变量会溢出。

于 2013-10-24T11:13:45.180 回答