1.求n是几位数
①用while循环
int main()
{
long long n;
printf("请输入一个数:");
scanf("%lld",&n);
int count = 0;//统计位数
if (n == 0)//!!!数字0是一个1位数
count = 1;
while (n != 0)
{
count++;
n /= 10;
}
printf("是%d位数\n",count);
return 0;
}
②用do while循环(推荐)
int main()
{
long long n;
printf("请输入一个数:");
scanf("%lld",&n);
int count = 0;//统计位数
do
{
count++;
n /= 10;
} while (n != 0);
printf("是%d位数\n", count);
return 0;
}
分析:计算n的位数的问题核心是当运用"/"除法时,整型除以整型得到的结果必然还是整型,则进行除法(除以大于等于10的数)过后的小数位会因丢失而引起数位减少,正因为这种现象我们可以借此计算出一个数的位数,通过循环进行除以10的操作,让这个数的位数逐渐减少,最后我们只需要知道这个操作执行了几次便可。
注意:我们在编写时要记得处理好“0”这个数,“0”并不是0位数而是1位数。
对比:上面我分别用了while和do-while两种循环进行编写,两者的区别在执行循环和判断条件的顺序上。do-while是先执行一遍循环中的语句再进行条件的判断,看是否再进行下一次循环;而while循环则是先进行判断看是否满足条件,若满足再进行循环。两者对比,do-while是在除以一次10,记上一位;而while是在记一位后再进行除以10的操作,也因为判断的条件为是否为零,而数字"0"因为等于0,无法进入循环进行记位操作。因此在使用while循环时就需要注意0是一位数这个问题。
2.逆序输出n
int main()
{
int n = 0;
int m = 0;
printf("请输入一个数:");
scanf("%d", &n);
do
{
m = n % 10;
printf("%d", m);
n /= 10;
} while (n != 0);
return 0;
}
分析:问题的重点落在怎么从后面一位一位的得到数再一位一位输出,"%"取余时则会发生只得到个位上的数,当我们对一个数进行%10(除以10取余数)时,我们便可以得到这个数的个位数字。但是只能得到个位的数并不满足我们的目的,我们还想得到十位,百位……那就将这些高位变成个位,再进行取余的操作就能得到每一位的数字了。前面提到的"/"除法则可以帮助我们将高位转换成个位,通过这两种符号运算我们便可以轻松的进行逆序输出n。
注意:1%10==1 1对10取余的值仍是1并不是0。
3.顺序输出n
int main()
{
int n = 0;
int m = 0;
int k = 0;
int j = 0;
printf("请输入一个数:");
scanf("%d", &n);
j = n;//将n的值提前存下来,后面可能会改变n的值
int count = 0;//统计位数
do
{
count++;
n /= 10;
} while (n != 0);
m = pow(10, count-1);
n = j;//把n的值赋值回来
do
{
k = n/m;
n %= m;
printf("%d", k);
m /= 10;
} while (n!=0);
return 0;
}
分析: 这回我们需要从最高位进行数字获取了,获取的途径成了重点,举个例子:256这个数我想得到百位上的数字我就需要用256除以100(10^(3-1))得到2和余数,但是这里的余数对我不重要,当我们得到百位上数字后想的到十位,那我们需要让十位变成最高位,这时我们就可以用%(取余操作)来抹去当前最高位上的数,对256%100(10^(3-1))结果为56,再用56/10(10^(2-1))运算后得到5和余数6,余数仍然不重要我们只为了得到十位上的数字,再将十位抹去,按这样的计算重复进行我们就可以从最高位依次得到每一位上的数字了。但是电脑只知道我们输入进去的n并不知道需要除以多少来进行运算,我们不难发现使用除法和取余的时候使用的是10的位数减一次方,每抹去一位,次方数减少1,所以我们在第一次计算最高位时需要知道这是一个几位数,才能得到对应的除数。用前面的方法可算出这个数是几位数,来帮助计算。
注意:“代码的实现怎么出了问题啊~”快看看进行完求位数问题后n的值还是不是之前的值了呢?
在求位数这一步操作中我们不小心对n的值进行了修改,所以我们用一个新变量保存n本身的值等求完位数后再让n变回最初的值。还需要注意每抹去一位数后需要进行次数减1的操作,换种表达就是对开始时使用的除数进行除以10的操作来获取下一次的除数。
总结:这三个题目是一种不断进阶的过程,问题的重点是对"/"和"%"的深入理解和灵活使用他们的特点来解决问题。在解决问题的路上我们会遇到报错和各种错误的运行结果,但都不足以阻拦我们前进,我们最终也会在不断的调试中取得进步从而到达成功的彼岸!
希望我的内容可以帮到你!!!如果有帮助别忘了帮我点亮大拇指,也请关注我,我会继续分享内容。那就让我们一起进步吧~

754

被折叠的 条评论
为什么被折叠?



