对于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,一块代码只完成一种功能。 一道简单题,写一个半小时,真有我的。

全部评论

相关推荐

10-17 10:05
已编辑
北华大学 全栈开发
牛客872465272号:掉头发了哥
点赞 评论 收藏
分享
11-08 16:53
门头沟学院 C++
投票
滑模小马达:第三个如果是qfqc感觉还行,我签的qfkj搞电机的,违约金也很高,但公司感觉还可以,听说之前开过一个试用转正的应届生,仅供参考。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务