从键盘读入一个整数数,计算该数有多少位,并打印出每一位上的数字.
- 循环和取余运算符(pow)
- 因为要使用到pow,所以我们要添加#include <math.h>引入数学库。
- 开始写代码
#include <stdio.h> int main() { int num, count = 0, temp; printf("请输入一个整数:"); scanf("%d", &num); temp = num; // 处理0的情况 if (temp == 0) { count = 1; printf("该数有 %d 位\n", count); printf("每一位上的数字为:%d\n", temp); return 0; } // 计算位数 while (temp != 0) { temp /= 10; count++; } // 打印位数 printf("该数有 %d 位\n", count); // 打印每一位数字 printf("每一位上的数字为:"); while (num != 0) { int digit = num % 10; printf("%d ", digit); num /= 10; } return 0; }
我们来一步步解析代码
-
int num, count = 0, temp;首先设置num,count,temp三个变量,其中num,count初始值为0,其次,他们都为整数。count是用来计算位数滴,num是用来读取键盘上输入的变量宝宝滴
-
printf("请输入一个整数:");
scanf("%d", &num);这一段可以想象为一个是电脑说:嘿嘿,你该输入一个整数了。然后你告诉电脑想要输入的整数,用scanf这个函数完成
`scanf("%d", &num);`是C语言中的输入函数,用于从标准输入(键盘)读取一个整数,并将其存储在变量`num`中。
在这里,`scanf`函数使用了格式化字符串`"%d"`,表示要读取一个十进制(decimalism)整数。`&num`表示将读取到的整数保存到变量`num`的内存地址中。
&
符号是取地址符号,用于获取变量的内存地址简单来说,这行代码的作用是从键盘输入一个整数,并将该整数存储到`num`变量中以供后续使用。
-
temp = num;让temp这个变量和num相同。
-
// 处理0的情况
if (temp == 0) {
count = 1;
printf("该数有 %d 位\n", count);
printf("每一位上的数字为:%d\n", temp);
return 0;
}
这段代码阐述了一个特例,即0
-
// 计算位数
while (temp != 0) {
temp /= 10;
count++;
}运用了一个小小的循环,while(新学的,嘿嘿)
举个例子来说明,假设我们输入的整数是 367。
- 初始时,
temp
的值等于 367。 - 第一次循环时,将
temp
除以 10 的结果是 36,将其赋值回temp
,此时temp
的值为 36,不等于0,所以继续循环。 - 第二次循环时,将
temp
除以 10 的结果是 3,将其赋值回temp
,此时temp
的值为 3,不等于0,所以继续循环。 - 第三次循环时,将
temp
除以 10 的结果是 0在C语言中,整数除法会将结果截断为整数,结果不会包含小数部分。
如果想要获得浮点数的结果,需要将操作数至少一个标记为浮点数,例如,将分子或分母中的一个数改为浮点数。
,将其赋值回temp
,此时temp
的值变为 0,等于0,所以循环结束。从上图,我有一个疑惑点:为什么“每一位上的数字为:”这样的字符串要写在循环外而不是循环内,经过实验,可以清晰的看到不同的结果(又是chatgpt胜利的一天),循环内这些语句也会循环,所以不是很好。故应该放在语句外。
-
int digit = num % 10;
printf("%d ", digit);
num /= 10;在第二个循环中,我们打印每一位上的数字。我们使用一个额外的变量
digit
来保存当前位数上的数字。在每次循环中,我们使用num
除以10的余数运算(num % 10
)得到当前位上的数字,并使用printf
函数打印出来。然后,我们将num
除以10,以便下一次循环能够处理下一位数字。(%d又出现了,还记得他是什么吗?十进制!)num=num/10 -
最后,我们使用
return 0
语句来表示程序正常结束。那么,你还能自己敲一遍代码吗?来督促我再敲一遍代码吧!(因为我真的很想成为大佬)
首先引入#include <stdio.h>
rerurn 0的艺术:在
main
函数中,只要执行到return
语句,程序就会终止,并返回相应的返回值。在这种情况下,return 0
表示程序成功执行,并返回0作为返回值。 -
我又犯了错误,temp,num之间的关系并没有理清楚,其中temp是一个变化的量,而num则不同,num的值不能变,所以需要写num=temp,让temp不断去变.
#include <stdio.h> //调用int main 函数 int main(){ //设置需要的变量,我们目前需要3个 int num=0 ,count=0,temp; temp =num; //还需要电脑输入的提示命令,记得分号!%d是什么,是十进制!把键盘输入的数值赋值给num //出现了第一个错误,即printf和scanf理解不清 //printf是你希望电脑给你显示在屏幕上的,scanf则是你用键盘告诉电脑的 //所以需要补一个printf //&很重要,用来传递地址 printf("输入一个整数:"); scanf("%d",&num); //靠靠靠,问题出现了,if不再像python那样不加括号和冒号,而是变成了 //if (表达式){},需要牢记喔 //目前运行不了,老报错 //考虑第一个情况,即0 if (num==0){ printf("该数有1位,每一位上的数字为0"); return 0; }; //第二种情况,计算有多少位,运用到了循环 //整数,所以整除后的小数点后面的位数都没有 while (temp!=0){ num/=10; count++; } return 0; //防止忘记,先写下来 }
这是目前敲下来的代码,问题有很多。
-
代码中存在几个错误:
-
int whlie (temp!=0)
应该是while (temp!=0)
,将whlie
改为while
。(这个上面代码已改完) -
num /= 10;
应该是temp /= 10;
,这是为了在循环中更新temp
的值而不是num
。 -
return 0;
应该在整个循环结束之后,而不是在循环的第一次迭代中。将return 0;
语句移至循环外部。while循环本题中不需要return 0 -
在第一个情况下(
num==0
),缺少了打印每一位数字的部分。需要添加打印语句。 -
疑问:为什么后面的count和digit不需要&符号就可以赋值
-
取地址符号(
&
)主要是用于获取变量的地址,而不是获取变量的值。在上述代码中,scanf
函数中使用了&
来获取变量num
的地址,因为我们希望将从键盘输入的值存储到num
的内存位置中。相比之下,count
和digit
变量的内存地址在定义时已经确定,并且我们只是将值存储到这些变量的内存位置中,而不是获取它们的地址。 -
报错:implicit declaration of function 'whlie' [-Wimplicit-function-declaration]
隐式函数声明是指在使用函数之前没有进行函数的显式声明或者函数原型的定义,而直接进行函数调用。当编译器遇到这种情况时,它会假设该函数的返回类型为
int
,且接受任意参数类型,并发出一个警告,提示函数可能未被正确声明。在代码中,出现了函数 'whlie' 的隐式声明错误,这是因为在使用
whlie
函数之前没有进行函数的显式声明或函数原型的定义。要解决这个问题,您可以通过在函数调用之前添加一个函数原型或显式声明来告诉编译器有关函数的信息。例如,如果 'whlie' 是一个自定义函数,您可以在函数调用之前添加函数原型或声明:int whlie(int temp);
这样,编译器就可以正确识别 'whlie' 函数,并在编译时将它与函数调用进行匹配。确保在函数调用之前提供正确的函数声明可以避免隐式函数声明警告并确保代码的正确性。
#include <stdio.h> //调用int main 函数 int main(){ //设置需要的变量,我们目前需要3个 int num=0 ,count=0,temp,digit; temp =num; //还需要电脑输入的提示命令,记得分号!%d是什么,是十进制!把键盘输入的数值赋值给num //出现了第一个错误,即printf和scanf理解不清 //printf是你希望电脑给你显示在屏幕上的,scanf则是你用键盘告诉电脑的 //所以需要补一个printf //&很重要,用来传递地址 printf("输入一个整数:"); scanf("%d",&num); //靠靠靠,问题出现了,if不再像python那样不加括号和冒号,而是变成了 //if (表达式){},需要牢记喔 //目前运行不了,老报错 //考虑第一个情况,即0 if (num==0){ printf("该数有1位,每一位上的数字为0"); return 0; }; //第二种情况,计算有多少位,运用到了循环 //整数,所以整除后的小数点后面的位数都没有 while (temp !=0 ){ temp/=10; count++; } printf("位数为:%d\n",count); //第三,每位上的数字,循环 printf("每位上的数字为:"); while (temp != 0){ digit==temp%10; printf("%d",digit); num/=10;// } return 0; //防止忘记,先写下来 }
这段代码问题很多最后的结果也很离谱,但我实在是找不到答案了。
这并不是我想要的答案呜呜呜。。。
- 问题:
-
1.temp =num;的位置问题
-
答:
因为在第7行之前执行
temp=num;
意味着temp
的初始值也是0 - 2.第二个循环为什么得用num而不是temp
- 答:
在第一个循环中,
temp
的值已经被除以 10,变为0。所以如果在第二个循环中使用temp
,这个循环将不会执行任何次数。通过将
temp = num;
放在第16行之前,确保在第一个循环之后,temp
仍然保留num
的初始值,从而在第二个循环中使用正确的值进行迭代。 - 第二个循环为什么要加num/=0;
- 答:为了确保我们不会重复处理任何一个数字,我们需要在每次迭代之后,将
num
除以10,以便在下一个迭代中处理数字的下一位数。 int digit = num % 10;
:这一行代码的意思是取num
的最后一位数字-
%
将num
除以10
,然后返回除法操作的余数,也就是num
的个位数。#include <stdio.h> //调用int main 函数 int main(){ //设置需要的变量,我们目前需要3个 int num=0 ,count=0,temp,digit; //还需要电脑输入的提示命令,记得分号!%d是什么,是十进制!把键盘输入的数值赋值给num //出现了第一个错误,即printf和scanf理解不清 //printf是你希望电脑给你显示在屏幕上的,scanf则是你用键盘告诉电脑的 //所以需要补一个printf //&很重要,用来传递地址 printf("输入一个整数:"); scanf("%d",&num); //这个的位置很重要,当我把它写在第7行时它输出的不是我想要的结果,但把它写在16行便成功了 //因为在第7行之前执行 temp=num; 意味着 temp 的初始值也是0 的位数 temp =num; //靠靠靠,问题出现了,if不再像python那样不加括号和冒号,而是变成了 //if (表达式){},需要牢记喔 //目前运行不了,老报错 //考虑第一个情况,即0 if (num==0){ printf("该数有1位,每一位上的数字为0"); return 0; }; //第二种情况,计算有多少位,运用到了循环 //整数,所以整除后的小数点后面的位数都没有 while (temp !=0 ){ temp/=10; count++; } printf("位数为:%d\n",count); //第三,每位上的数字,循环 printf("每位上的数字为:"); while (num != 0){ int digit=num%10; printf("%d ",digit); num/=10;//当我把这行删去的时候,我发现它出现了无限循环,很吓人 //但为什么这样我也不是很清楚 //为了确保我们不会重复处理任何一个数字,在每次迭代之后,将 num 除以10,以便在下一个迭代中处理数字的下一位数。 } return 0; //防止忘记,先写下来 }
这就是最终代码啦,终于耗时半天把它完完全全的搞懂啦!在此鸣谢gpt和群友们的帮助,过程艰辛,但最后自己终于全部敲完的喜悦是溢于言表的,给了自己勇气呐!
#include <stdio.h> int main(){ int num=0 ,count=0,temp,digit; printf("输入一个整数:"); scanf("%d",&num); temp =num; //考虑第一个情况,即0 if (num==0){ printf("该数有1位,每一位上的数字为0"); return 0; }; //第二种情况,计算有多少位,运用到了循环 while (temp !=0 ){ temp/=10; count++; } printf("位数为:%d\n",count); //第三,每位上的数字,循环 printf("每位上的数字为:"); while (num != 0){ int digit=num%10; printf("%d ",digit); num/=10; } return 0; }
以上为最后的精简代码,需要的小伙伴自取呀。