对于c中自定义函数的进一步理解
链接:https://ac.nowcoder.com/acm/problem/16538 来源:牛客网
试计算在区间1 到n 的所有整数中,数字x(0 ≤ x ≤ 9)共出现了多少次? 例如,在1到11 中,即在1、2、3、4、5、6、7、8、9、10、11 中,数字1 出现了4 次。
这道题就是不断地将位数向前推的思路,却卡了我一个小时。
int tool (int n, int x);
int main(void) {
int n;
scanf("%d", &n);
int x;
scanf("%d", &x);
int sum = 0;
for (int i = 1; i <= n; i++) {
while (i != 0) {
//用10进行取余,即可得到最小位的数字
int f = i % 10;
//判断所得位数字是否为对应的数字,如果是则+1
if (f == x) {
sum ++;
}
//将原整数 / 10 → 将数字向右推进一位 即:原来的第二位变为第一位
i = i / 10; //只要n不为0(数字没有位数了,则继续循环)
}
}
printf("%d", sum);
return 0;
}
这是我写的第一次代码,却陷入了死循环。 我将循环与判断数字的方法写到了一起,然而却内存超标了。 经过我的debug,我发现函数i在每次while循环后都被赋值为0,导致for循环变成了死循环。
int count =0;
void tool(int i,int x);
int main(void){
int n,x;
scanf("%d %d",&n,&x);
for(int i=1;i<=n;i++){
tool(i,x);
}
printf("%d",count);
return 0;
}
void tool(int i,int x){
while (i != 0) {
//用10进行取余,即可得到最小位的数字
int f = i % 10;
//判断所得位数字是否为对应的数字,如果是则+1
if (f == x) {
count ++;
}
//将原整数 / 10 → 将数字向右推进一位 即:原来的第二位变为第一位
i = i / 10; //只要n不为0(数字没有位数了,则继续循环)
}
}
运用自定义函数,由于形参的变化不影响实参,笔者既能在判断中调用I的递增,同时又使得I不会为0(每一次方法中的形参I变为了0,但是实参i不受影响。)
感悟:多debug,一块代码只完成一种功能。 一道简单题,写一个半小时,真有我的。