任务描述
根据整数的长度来分段重新组合生成新数。输入多个偶数位数的整数m,将数平均分为两段:前半段为s,后半段为t,将前后半段交换,构成一个新的整数,并输出,不保留高位零。当输入数据为-1时结束。
输入:3025
输出:2530
输入:456089
输出:89456
相关知识
确定整数的位数
计算机如何确定一个整数的位数?
(1)要获得一个整数n的具体是几位数,可利用log10和floor函数:
m = floor(log10(n)+1)
(2) 利用循环,一位位地数数:从个位数开始,一位位地将数字去掉(n/10),去掉的同时进行计数。
cnt = 0;
while ( n != 0 )
{
cnt++; //cnt最终的值即为位数
n = n / 10;
}
本关任务中循环条件很明确:当输入的数不为-1时,循环进行,否则,程序结束;循环体的主要操作是整数分段,分段的位置与整数位数有关;同时,要使用条件变为不满足,要保证在循环体中能有改变此数的操作,即为输入语句。
pow()函数的误差
pow()函数的参数与返回值均为double类型,使用数值方法实现的求n次方,求解结果是有误差的。因此,在对pow()函数的返回值进行取整运算时,经常会加上一个非常小的小数,如1e-6,以保证取整结果不会比预计的值少1。
例如:
b = (int)(pow(x,y)+1e-6);
条件循环控制框架
while语句
scanf("%d",&n);
while (n != -1)
{
......
scanf("%d",&n);
}
注意其中两个scanf()语句的位置和作用。*
测试说明
程序会对你编写的代码进行测试:
输入测试数据:
3025
需要你的程序输出:
2530
只要不输入-1,程序可以一直运行,连续输入数据,依次分段重新生成的新的数,输出数据的末尾有换行。
效果如下:
代码如下
#include<stdio.h>
#include<math.h>
int main()
{
int m,n,x,y,i,r;
scanf("%d",&n);
while(n!=-1)
{
m=floor(log10(n)+1);
i=m/2;
x=n/(pow(10,i));
y=n-(x*(int)pow(10,i));
r=y*pow(10,i)+x;
printf("%d\n",r);
scanf("%d",&n);
}
return 0;
}