2012-11-15 46 views
5

我正在写一个代码来显示C语言中任何正整数的数字。 例如,整数345将显示为三四五。打印英文中的一个整数

我写的代码适用于所有数字大于0的整数。但某些整数如10,304,0等不能正确显示。为了应对挑战,不允许使用递归和数组。只有循环和如果构造是允许的。 有什么建议吗?

#include<stdio.h> 
int main(void) 
{ 
    int num, num_copy, accum = 1; 

    printf("Enter an integer "); 
    scanf("%i",&num); 

    num_copy = num; 

    while (num > 0){ 

    while (num > 9){ 
     num = num/10; 
     accum *= 10; 
     } 
     switch (num){ 

     case (1): 
       printf("one "); 
       break; 
     case (2): 
       printf("two "); 
       break; 
     case (3): 
       printf("three "); 
       break; 
     case (4): 
       printf("four "); 
       break; 
     case (5): 
       printf("five "); 
       break; 
     case (6): 
       printf("six "); 
       break; 
     case (7): 
       printf("seven "); 
       break; 
     case (8): 
       printf("eight "); 
       break; 
     case (9): 
       printf("nine "); 
       break; 
     } 
     num_copy = num_copy - (num*accum); 
     num = num_copy; 
     accum = 1; 
    } 

    return 0; 
} 
+1

你不处理'0' –

+0

为什么各地情况标签括号?为什么不围绕其他常量? 'accum * =(10);'或'return(0);' – pmg

+0

尝试逐行逐行扫描代码。当你这样做时,你会注意到几个问题。 –

回答

2

喔!这听起来很有趣!没有数组和没有递归权?

所以既然我们不能使用递归,我们需要建立倒退数:

#include<stdio.h> 
int main(void) 
{ 
    int num, backwards = 0, digit, backupzeros = 0; 

    printf("Enter an integer "); 
    scanf("%i",&num);   // get the number 

    while(num > 0){ 
     digit = num % 10; // pry off the last digit 
     num /= 10;   // take off the digit 

     if((backwards == 0) && (digit == 0)) // If it's a number that ends in 0 
      backupzeros++;     // save it, we'll use that later 

     backwards = (backwards * 10) + digit; // glue it on backwards 
    } 

    // Now we have the number reversed. Next we need to print the digits 

    while (backwards > 0){ 
     digit = backwards % 10; 
     backwards /= 10; 

     switch (digit){ 

     case 1: 
       printf("one "); 
       break; 
     case 2: 
       printf("two "); 
       break; 
     case 3: 
       printf("three "); 
       break; 
     case 4: 
       printf("four "); 
       break; 
     case 5: 
       printf("five "); 
       break; 
     case 6: 
       printf("six "); 
       break; 
     case 7: 
       printf("seven "); 
       break; 
     case 8: 
       printf("eight "); 
       break; 
     case 9: 
       printf("nine "); 
       break; 
     default: 
       printf("zero "); 
       break; 
     } 
    } 

    while(backupzeros > 0) { 
     printf("zero "); 
     backupzeros--; 
    } 

    return 0; 
} 
+0

我可能不应该写整个事情,因为这听起来像一个家庭作业......但今天我可以休息一下。 :) – Mike

+0

这不是一个家庭作业的任务。我已经过了那个年龄段。我是一名航空公司飞行员,学习如何编程一台电脑。感谢您花时间回复我的问题。 – user1825355

+0

@ user1825355 - 我认为您永远不会老得再回到学校。 (具有讽刺意味的是,我是一名软件工程师,但我要回去取得飞行员执照),我很乐意提供帮助,因为即使没有递归和阵列的限制,您也可以看到,可以解决问题,你会发现大多数问题有很多不同的解决方案。 – Mike

0

“(..),但某些整数像10,304,0”,

什么这一切的数字有什么共同点? “零”就是答案。

你还必须把你的开关处理的条件也归零。

你可以做这样的事情:

#include<stdio.h> 
int main(void) 
{ 
    int num, num_copy, accum = 1; 

    printf("Enter an integer "); 
    scanf("%i",&num); 

    char str[15]; 
    sprintf(str, "%d", num); 


    for(num = 0; str[i] != '\O'; num++) 
    { 
     switch (num){ 

     case (1): 
       printf("one "); 
       break; 
     case (2): 
       printf("two "); 
       break; 
     case (3): 
       printf("three "); 
       break; 
     case (4): 
       printf("four "); 
       break; 
     case (5): 
       printf("five "); 
       break; 
     case (6): 
       printf("six "); 
       break; 
     case (7): 
       printf("seven "); 
       break; 
     case (8): 
       printf("eight "); 
       break; 
     case (9): 
       printf("nine "); 
       break; 
     case (0): 
      printf("zero "); 
       break; 
     } 
    } 

    return 0; 
} 

您可以用sprintf()的整数转换成一个char []。然后你只需要遍历char数组

+0

零不仅到达开关。 – user1825355

+0

尽量放零条件,并告诉我什么发生 – dreamcrash

+0

循环将无限期运行 – user1825355

2

的如果你写一个递归函数,它会帮助您避免使用以相反的顺序打印循环:

#include<stdio.h> 

void print_num(int num) 
{ 
if(num == 0) return; 
print_num(num/10); 

     switch (num%10){ 

     case (1): 
       printf("one "); 
       break; 
     case (2): 
       printf("two "); 
       break; 
     case (3): 
       printf("three "); 
       break; 
     case (4): 
       printf("four "); 
       break; 
     case (5): 
       printf("five "); 
       break; 
     case (6): 
       printf("six "); 
       break; 
     case (7): 
       printf("seven "); 
       break; 
     case (8): 
       printf("eight "); 
       break; 
     case (9): 
       printf("nine "); 
       break; 
     case (0): 
       printf("zero "); 
       break; 
     } 
} 


int main(void) 
{ 
    int num, num_copy, accum = 1; 

    printf("Enter an integer "); 
    scanf("%i",&num); 
    print_num(num); 

    return 0; 
} 

非递归解决方案使用数组来存储数字:

void print_num(int num) 
{ 
int i=0,j; 
int arr[256]; 

while(num) 
{ 
arr[i++]=num%10; 
num/=10; 
} 

for(j=i-1; j>=0;j--) 
{ 
     switch (arr[j]){ 

     case (1): 
       printf("one "); 
       break; 
     case (2): 
       printf("two "); 
       break; 
     case (3): 
       printf("three "); 
       break; 
     case (4): 
       printf("four "); 
       break; 
     case (5): 
       printf("five "); 
       break; 
     case (6): 
       printf("six "); 
       break; 
     case (7): 
       printf("seven "); 
       break; 
     case (8): 
       printf("eight "); 
       break; 
     case (9): 
       printf("nine "); 
       break; 
     case (0): 
       printf("zero "); 
       break; 
     } 
} 
+0

您的解决方案是完美的。我忘了提及这个问题是为了解决问题而没有递归。只有循环,如果允许构造。还有什么想法? – user1825355

+0

我明白了。你可以简单地将数字存储在数组中然后打印呢? –

+0

再次抱歉,没有数组呢! – user1825355

1

这是一个大学运动,许多年前!从1

整数999

#define MAX_BUF 100 

int main(){ 

    int num, i=0, j, digit; 
    char *buf[MAX_BUF]; 

    printf("Integer: "); 
    scanf("%d",&num); 

    while(num){ 
     digit = num %10; 
     num = num /10; 

     switch(digit){ 
      case 0: buf[i++] = "zero"; break; 
      case 1: buf[i++] = "one"; break; 
      case 2: buf[i++] = "two"; break; 
      case 3: buf[i++] = "three"; break; 
      case 4: buf[i++] = "four"; break; 
      case 5: buf[i++] = "five"; break; 
      case 6: buf[i++] = "six"; break; 
      case 7: buf[i++] = "seven"; break; 
      case 8: buf[i++] = "eight"; break; 
      case 9: buf[i++] = "nine"; break; 
     } 
    } 

    for(j = i-1; j >= 0; j--){ 
     printf("%s-", buf[j]); 
    } 

    return 0; 
} 
+0

@ b3h3mOth抱歉让你失望,但没有阵列,没有递归允许为了挑战。只有循环,如果构造! – user1825355

+0

我明白,博姆 - 雅可比docet :) – b3h3m0th

0

未经测试...

char *digitNames[10] = { 
    "zero", 
    "one", 
    ... // Too lazy to fill in the rest.. 
    "nine" 
} 

void displayNumber(uint32_t number) { 
    int totalDigits = 0; 
    int scale = 10; 
    uint32_t divisor = 1000000000; 
    uint32_t digit; 

    do { 
     scale--; 
     digit = number/divisor; 
     number -= digit * divisor; 
     divisor /= 10; 
     if(scale == 0) { 
      fputs(stdout, digitNames[digit]); 
     } else if((digit != 0) || (totalDigits != 0)) 
      printf("%s ", digitNames[digit]); 
      totalDigits++; 
     } 
    } while(scale != 0); 
}