代码阻止循环移位

code blocks cyclic shift

本文关键字:循环移位 代码      更新时间:2023-10-16

我是C编程的新手,一直在尝试执行这个程序来移动数字。前任。我希望 4567 经历右周期偏移,然后它会变成 7456。

#include<stdio.h>
#include<math.h>
using namespace std;
int main()  
{
  int num;
  scanf("%d",&num);
  int temp=num;
  int flag=0;
  while(temp!=0)
  {
    temp=temp/10;
    flag++;
  }
  int r=num%10;
  int s=num/10;
  int k=pow(r,flag);
  int crs=k+s;
  printf("%d",crs);
  return 0;
}

你做错的事情是处理最右边的数字(在原始数字中)。你不想把它带到flag的力量.您想将10 flag的幂乘以最低有效(最右边)的数字。

在计算数字并确定应移动最低有效数字的步数时,您也应该小心。例如,如果您有123则有三位数字,但您应该只将最低有效数字向左移动两步(其余数字向右移动一步)。当数字0时,可能会特别考虑 - 无论如何你都会得到零,这可能是你想要的。此外,您还应该考虑如何处理负数。

像这样:

#include<stdio.h>
#include<math.h>
using namespace std;
int main()
{
  int num;
  scanf("%d",&num);
  int temp=num;
  int flag=0;
  while(temp!=0)
  {
     temp=temp/10;
     flag++;
  }
  int r=num%10;
  int s=num/10;
  int k=r*pow(10,flag-1); // <- here's the fix
  int crs=k+s;
  printf("%d",crs);
  return 0;
}

当然还有一些细节。如果您正在C++编程,则不应包含stdio.hmath.h。相反,你应该包括cstdiocmath(有些人可能会抱怨使用cstdio并说你应该使用iostreams,但这只是一个反对问题)。

您可以使用数学来查找数字中有多少位数字,而无需 for 循环。 只需使用地板(日志10(数字))。

int main(){
 int val = 11023;
int rem = val%10;
int positions = (int) floor(log10(val));
int left_digit = rem*(int) pow(10,positions);
printf("%dn", left_digit+val/10);

}

此语句

int k=pow(r,flag);

没有意义。你至少应该我们

int k=pow( 10,flag-1) * r;

但是,如果函数没有重载 int 类型,那么它可以将操作数转换为类型 double

实际上,没有必要使用该功能。

程序可以按以下方式编写

#include <iostream>
int main()
{
    while ( true )
    {   
        const unsigned int Base = 10;
        std::cout << "Enter a non-negative number (0-exit): ";
        unsigned int x = 0;
        if ( !( std::cin >> x ) || ( x == 0 ) ) break;
        unsigned int multiplier = 1;
        for ( unsigned int tmp = x; tmp /= Base; ) multiplier *= Base;
        std::cout << "The shifted number is " << x / Base + x % Base * multiplier << std::endl;
    }        
}    

它的输出可能看起来像

Enter a non-negative number (0-exit): 567
The shifted number is 756
Enter a non-negative number (0-exit): 0