2012-11-14 167 views
-1

我有这样的代码:C:什么我不明白

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

int i,j; 
long int maxc=0,nn; 

long int max(long int n) 
{ 
    maxc=0;nn=n;i=1; 

    if(n<10 && n>=0) 
     return n; 

    while(nn!=0) 
    { 
     if(maxc<nn%10) 
     { 
      maxc=nn%10; 
      j=i; 
     } 
     i++; 
     nn/=10; 
    } 

    return maxc*(pow(10,i-2))+max(n/(pow(10,j))*(pow(10,j-1))+n%((int)pow(10,j-1))); 
} 

int main() 
{ 
    long int n; 
    printf("Dati n: "); 
    scanf("%d",&n); 
    printf("%ld",max(n)); 
    return 0; 
} 

N =用户 最大给予NUMER =函数返回的最大数量由n个位数。 E.G:对于n = 1234.max应该返回4321,对于n = 26341,最大应该返回64321

问题是,有时编译器工作,我的意思是某些数字它返回我期望的值,但有时不。通常会返回相同的数字位数,但用9或4替换(a)数字/秒...我无法获得解决此问题的规则。

谢谢!我用Ubuntu的代码块。

+0

你有没有调试? –

+1

对于什么'n'它是错的? – deepmax

+0

你应该使用'fscanf'而不是'scanf'(= – dcow

回答

1

远离pow。它是一个浮点函数,其结果是近似。如果它返回的值稍微偏小(比如说2.9999而不是3.00000),那么你的代码会将其截断为最接近的较低值(2)。

我会强烈建议一个整数或字符的解决方案。

0

我不会给你整个解决方案,但我会给你这个想法。

  • 从键盘扫描数字并将它们存储在long int变量中。
  • 将数字隐藏到数组中的字符中。 (不要忘记ASCII码)。
  • 按降序对数组进行排序。
  • 打印数组照顾ASCII码(在我的例子中,我存储的值不是字符,这就是为什么我可以打印它们为%d)。

    /* Prototypes*/ 
    int stringConverter(char const * a, long int val); 
    void decsort(int * const a, int digits); 
    
    int main(void) 
    { 
        char a[ SIZE ]; 
        int digits; 
        long int val; 
    
        printf("Enter the number: "); 
        scanf("%ld", &val); 
    
        digits = stringConverter(a, val); 
        decsort(a, digits); 
    
         /* Printer */ 
         for(i = SIZE - digits - 1; i < SIZE; i++){ 
          printf("%d", a[ i ]); 
         } 
         return 0; 
    } 
    
    
    int stringConverter(char * const a, long int val) 
    { 
        int i, int j = 0; 
    
        for(i = (SIZE - 1); i >= 0; i--){ 
         *(a + i) = (val % 10); 
         j++; 
         val = val/10; 
    
         if(val < 10){ 
          i--; 
          *(a + i) = val; 
          j++; 
          break; 
         } 
        } 
        return j; 
    } 
    
    
    
    void decsort(char * const a, int digits){ 
    /* Any sort */ 
    }