我是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;
}
答案 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.h
或math.h
。相反,您应该包含cstdio
和cmath
(有些人可能会抱怨使用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);
}