解题思路:
位数的判断:考虑用“/”,C语言中的'/',如果操作数(即除数和被除数)都是整型(整数),则结果会自动舍弃小数部分,例如123/10 按数学计算即为12.3,C语言输出为12. 对比123和结果12,我们发现C语言中的'/'能够达到移位的操作;因此我们可以依次移位并使用一个计数变量,每移一位计数变量加一,直至最终移位完成原数据变成零,为此我们可以套用循环来执行;
代码如下:
scanf("%d",&x);
while(x)
{
x/=10;
counter++;
}
printf("%d\n",counter);
2.正序输出每一位上的数据,数字之间用空格间隔,末尾没有空格:
考虑'%10’它可以每次得到每个数据的个位数,所以我们考虑我可以对数据进行移位操作,让它的每一位都依次出现在个位上,而后我们令其对10取余即可。
例如123,我们可以先用123/100此时我们得到1;再对1对10取模即可;注意此时一定不要省略这个取模操作!(原因见下文注意事项)
接着我们考虑特殊要求,即空格问题,因为数据末尾没有空格,所以我们不能在使用printf语句的时候就在%d的后面直接添加一个空格,否则最后肯定会有一个空格,为此我们应进行判断,如果输出是输出最后一位数字,我们不让其输出空格,其他情况则可,我们可以使用if选择语句来完成;
参考代码:
for(i=1;i<counter;i++)
y*=10; //这里是为了移位操作打基础;
while(1)
{
x=num;
printf("%d",x/y%10);
y/=10;
counter--; //输出最后一位的时候counter的值变成了0;条件不成立不打印空格,循环也应结束了,用break跳出循环;
if(counter)
putchar(' ');
else break;
}
3.逆序输出数据
方法一:直接逆序输出每一位数字(还是需要运用'/'的移位功能,'%'的读取个位数据的功能)
代码如下:
while(num)
{
printf("%d",num%10);
num/=10;
}
方法二:构造一个逆序数,再输出
代码如下:
int a=0,b=0;
while(num)
{
a=num%10;
num/=10;
b=b*10+a;
}
printf("%d",b);
注意事项:
如果我们省去对10取模操作,结果会出错;例如123,第一位输出1 没问问题,但是第二位呢,123/10得到12 如果没有对10取模操作,结果输出即为12,而这显然不是我们的意愿!
此程序我们对原始数据多次进行了不同操作,为避免不同操作数据之间的影响,我们应定义变量保存我们输入的数据,以便再次赋值使用!
参考代码:#include<stdio.h>
int main()
{
int x,counter=0,y=1,i=1,num;
scanf("%d",&x);
num=x;
while(x)
{
x/=10;
counter++;
}
printf("%d\n",counter);
for(i=1;i<counter;i++)
y*=10;
while(1)
{
x=num;
printf("%d",x/y%10);
y/=10;
counter--;
if(counter)
putchar(' ');
else break;
}
putchar('\n');
int a=0,b=0;
while(num)
{
a=num%10;
num/=10;
b=b*10+a;
}
printf("%d",b);
return 0;
}
我是大一新生,接触编程时间不长,所以思路比较基础,可能不是最简便的,但我亦是在尽力了。
如有裨益,吾之幸也!愿与君一同成长~
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复