数字1的个数
题目描述:给定一个整数n,计算所有小于等于n的非负整数中数字1出现的个数。
示例:
输入:13
输出:6
解释:数字1出现在以下数字中:1,10,11,12,13(其中11中1出现两次)。
思路:
遍历所有不大于n的非负整数,对每个数通过对其不断除十、取余,判断其中1的个数,累加结果即为所求。
代码:
#include <stdio.h>
int main(){
int n,i,j,k;
int sum=0;
printf("enter number",&n);
scanf("%d",&n);
for (k=1;k<=n;k++){
i=k;
while (i>=10){
j=i%10;
if (j==1) sum++;
i=i/10;
}
if (i==1) sum++;
}
printf("%d",sum);
return 0;
}
误区:第一次写的代码如下:
#include <stdio.h>
int main(){
int n,i,j,k;
int sum=0;
printf("enter number",&n);
scanf("%d",&n);
for (i=1;i<=n;i++){
while (i>=10){
j=i%10;
if (j==1) sum++;
i=i/10;
}
if (i==1) sum++;
}
printf("%d",sum);
return 0;
}
此时输入样例13后没有结果输出,多次检查后发现陷入了死循环:每次i增加到10进入while循环,i又除十变为1。产生循环
解决办法:在fou循环里设置不同变量进行遍历,可以不受i变化的影响。
老铁发现代码可以优化如下(^^):
#include <stdio.h>
int main(){
int n,i,j,k;
int sum=0;
printf("enter number",&n);
scanf("%d",&n);
for (k=1;k<=n;k++){
i=k;
while (i>=0){
j=i%10;
if (j==1) sum++;
i=i/10;
}
}
printf("%d",sum);
return 0;
}