代码块循环移位

时间:2016-03-04 07:33:43

标签: c++ c

我是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;
}

3 个答案:

答案 0 :(得分:1)

你做错的是处理最右边的数字(原始数字)。你不想把它带到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代替,但这仅仅是意见问题)

答案 1 :(得分:0)

本声明

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

答案 2 :(得分:0)

您可以使用数学来查找没有for循环的数字中的位数。只需使用楼层(log10(数字))。

int main(){

 int val = 11023;

int rem = val%10;

int positions = (int) floor(log10(val));

int left_digit = rem*(int) pow(10,positions);

printf("%d\n", left_digit+val/10);

}