【问题标题】:How to move first digit to the last position in a number in C如何将第一个数字移动到C中数字的最后一个位置
【发布时间】:2020-01-30 07:10:04
【问题描述】:

我们以数字 123 为例。我将如何移动 1 以使结果数字为 231?

unsigned long int N;
scanf("%lu", &N);
unsigned long int firstDigit;
while (N >= 10)
{  
  N /= 10;
  firstDigit = N;
  count++;
}

我有这个代码来识别第一个数字是什么,但现在我不知道如何移动它。

【问题讨论】:

  • 现在你已经得到了第一个数字,将它乘以足够的 10 次以使其处于正确的位置(count 在这里很有用),然后从 N 中减去它。比如N是123,那么firstDigit是1,count应该是2。1乘以10两次得到100。123减去23。剩下的很简单。
  • 我会用字符串来做这个
  • 可以双向完成,取决于作业的要求。 (尽管我同意使用字符串会更容易)。在数字上,找到第一个数字后,您需要从 N 中减去 10^(count-1) * digit,然后乘以 10 并添加 digit
  • 如果输入的是000123,结果应该是001230还是231

标签: c integer digits


【解决方案1】:

通过while循环,我们得到一个不包括第一位数字的数字(在ans变量中)&
仅给定数字的第一个数字(在“N”变量中)。

unsigned long int N;
scanf("%lu", &N); // N=1234
unsigned long int ans=0;
unsigned long int pow=1;
while (N>9) {
    ans += pow * (N%10);
    pow *= 10;
    N /= 10;
}  // ans=234  N=1

ans = ans*10 + N;   

执行后变量的值是多少:-

 |     condition     | ans       | pow  | N     |
 | ----------------- | --------- | ---- | ----- |
 |   before loop     | 0         | 1    | 1234  |
 |     1234 > 9      | 4         | 10   | 123   |
 |      123 > 9      | 34        | 100  | 12    |
 |       12 > 9      | 234       | 1000 | 1     |
 | 1 ≯ 9 (loop over) |           |      |       |
 |    after loop     | ans = 234 |      | N = 1 | 

【讨论】:

    【解决方案2】:

    假设N = 546,得到firstDigit = 5。因此,要首先将 firstDigit 移动到最后一个位置,您必须从 N 中删除 firstDigit。如果count = number of digits of NN - (firstDigit * 10^(count-1)) 将给出不带firstDigit 的数字。对于 N = 546,您将获得 removedFirstDigit = 46。因此,您只需使用 10 * removedFirstDigit + firstDigit 将 firstDigit 附加到最后一个位置即可获得最终答案。按照该代码更好地理解,

    unsigned long int N;
    scanf("%lu", &N);
    unsigned long int value = N;
    unsigned long int firstDigit;
    int count = 0;
    while (N >= 10)
    {  
      N /= 10;
      firstDigit = N;
      count++;
    }
    
    unsigned long int powerOfTen = 1;
    for(int i=1; i<=count; i++) {
        powerOfTen *= 10;
    }
    
    unsigned long int removedFirstDigit = value - (firstDigit * powerOfTen);
    unsigned long int ans = 10 * removedFirstDigit + firstDigit;
    
    printf("%lu", ans);
    

    您也可以通过将数字转换为字符串并将第一个字符移动到最后一个位置来解决此问题。

    【讨论】:

      【解决方案3】:

      另一种观点如何。我们将考虑字符串操作。

      #include <stdio.h>
        int main()
        {
           char i[10]="";
           scanf ("%s", &i);
           for (int j = 1; i[j] != NULL; j++)
            printf ("%c",i[j]);
            printf ("%c\n",i[0]);
           return 0;
        }
      

      希望有帮助:)

      【讨论】:

        【解决方案4】:

        这是一个不使用循环的解决方案

        #include <stdio.h>
        #include <math.h>
        
        int main() {
            unsigned long int length = 0;
            unsigned long int ans = 0;
            
            unsigned long int number;
            scanf("%lu", &number);   // number = 9731
            
            length = log10(number);
            
            unsigned long int power = pow(10,length);
            ans = (number%power)*10  +  number/power; // 7319
            
            printf("%lu %lu %lu %lu", number, length, power, ans);
        }
        

        数字:输入数据
        长度:以 10 为底的对数将给出 ((数字的大小) - 1)
        功率:10长度

        获取答案:

        • 占第一位(数字/功率) // got only 9
        • 占其余数字(数字 % 功率) // got 731
        • 在添加这两者之前,应删除重叠 // 9 &amp; 1
          - 所以剩下的数字应该左移 //731* from 731
          - 为此乘以 10 // 731 become 7310
        • 添加两个数据 // 7310 + 9

        【讨论】:

          猜你喜欢
          • 2022-01-08
          • 1970-01-01
          • 1970-01-01
          • 2021-02-10
          • 1970-01-01
          • 2017-03-08
          • 1970-01-01
          • 2013-08-01
          • 1970-01-01
          相关资源
          最近更新 更多