5

Linux で C でコーディングしていますが、数値を逆にする必要があります。(例: 12345 は 54321 に変わります)、私は itoa を使用してそれを文字列に変換し、それを逆にするつもりでした。おそらく文字列操作の方がはるかに簡単ですが、itoa は非標準であり、含まれていません。 gccで。10進数でバイナリローテーションスタイルを行う方法はありますか?そうでない場合は、どのようなアプローチをとるべきですか?

4

8 に答える 8

14
int n;
scanf("%d",&n);
int rev=0,rem;
while(n>0)
{
    rem=n%10; //take out the remainder .. so it becomes 5 for 12345
    rev=rev*10+rem; //multiply the current number by 10 and add this remainder.
    n=n/10; //divide the number. So it becomes 1234.
}
printf("%d",rev);
于 2013-05-08T18:02:03.910 に答える
2
#include<stdio.h>
main()
{
                 int rev=0,n;
                 scanf("%d",&n);
                 while(n)
                 {
                         rev=10*rev+n%10;
                         n/=10;
                 }
                 printf("result=%d",rev);
}
于 2014-05-07T23:04:42.330 に答える
1

ひもなしでやってください。

fkt()
   {
    int i = 12345;

    int n = 0;
    int x;
    char nr[10];
    char *p = &nr[0];

    while(i != 0)
    {
        x = i % 10;
        i = i/10;
        n = n * 10 + x;
        *p = x+'0';
        p++;
    }

    *p = 0;

    printf("%d   %s\n", n, nr);
    return 0;
}
于 2013-05-08T18:36:05.053 に答える
0

iota()標準の C 関数ではありませんが、snprintf()同様に目的を果たします。

/* assume decimal conversion */
const char * my_itoa (int input, char *buffer, size_t buffersz) {
    if (snprintf(buffer, sz, "%d", input) < sz) return buffer;
    return 0;
}

入力を負にすることはできないため、符号なしの型を使用できます。

unsigned long long irev (unsigned input) {
    unsigned long long output = 0;
    while (input) {
        output = 10 * output + input % 10;
        input /= 10;
    }
    return output;
}

入力を逆にすると、値が入力の型に適合しなくなる可能性があるため、返される結果はより広い型を使用しようとします。unsignedunsigned long longが同じ幅の場合、これはまだ失敗する可能性があります。このような場合、文字列を使用して逆の値を表すのがおそらく最も簡単です。または、数値を出力することが唯一の目的である場合は、ループを使用して数字を逆順に出力することができます。

void print_irev (unsigned input) {
    if (input) {
        do {
            putchar('0' + input % 10);
            input /= 10;
        } while (input);
    } else {
        putchar('0');
    }
    putchar('\n');
}
于 2013-05-08T18:18:58.180 に答える
0

本当に文字列を使用したい場合は、sprintf を使用して itoa と同じことを行うことができます。

int k = 12345;
char str[40];
sprintf(str,"%d",k);

次に、文字列を反転し、atoi または sscanf を使用して int に戻します。

于 2013-05-08T18:04:33.890 に答える
0

スタックを使用してこれを行うことができます。

struct node
{
  char character;
  struct node *next;
};

struct node *list_head,*neos;

main()
{
  list_head=NULL;
  char str[14];
  int number,i;
  scanf("%d",&number);     

  sprintf(str,"%d",number);  //here i convert number to string
 for(i=0;i<strlen(str);i++)  //until the end of the string
 {
   add_to_stack(str[i]);   //i take every character and put it in the stack
 }
 print_the_number();

}

ここで注意、最後に追加されたアイテムをスタックに、最初に取り出した、なぜそれが機能するのか..

void add_to_stack(char charac)
{
  neos=(struct node*)malloc(sizeof(struct node));
  neos->character=charac;
  neos->next=list_head;
  list_head=neos;
}

void print_the_number()
{
   struct node *ptr;
   ptr=list_head;
   while(ptr!=NULL)
   {
     printf("%c",ptr->character);
     ptr=ptr->next;
   }  
}
于 2013-05-08T21:15:21.913 に答える