PAT (Basic Level) Practice 1002 写出这个数

一、概述

做advanced的题做的快自闭,A1004的题目应该和层次遍历有关系,不想写,做点basic的歇歇。但这个1002可日了狗了。

1002很简单的思路,给一个特别大的数,求它的各位和,数太大用double都不行,那就用char。我的思路特别弱智,char存数组,sum存各位和,sum转char,输出各位。因此需要两个char。这就出现了特别奇怪的bug。

二、代码及分析

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	char a[200],b[5];
	scanf("%s", a);
	int i = 0;
	int sum = 0;
	while (a[i] != '\0')
	{
		sum = sum + a[i]-48;
		i++;
	}
	sprintf(b,"%d", sum);
	i = 0;
	while (b[i+1] != '\0')
	{
		switch (b[i])
		{
			case '0':
				printf("ling ");
				break;
			case '1':
				printf("yi ");
				break;
			case '2':
				printf("er ");
				break;
			case '3':
				printf("san ");
				break;
			case '4':
				printf("si ");
				break;
			case '5':
				printf("wu ");
				break;
			case '6':
				printf("liu ");
				break;
			case '7':
				printf("qi ");
				break;
			case '8':
				printf("ba ");
				break;
			case '9':
				printf("jiu ");
				break;
		}
		i++;
	}

	switch (b[i])
	{
	case '0':
		printf("ling");
		break;
	case '1':
		printf("yi");
		break;
	case '2':
		printf("er");
		break;
	case '3':
		printf("san");
		break;
	case '4':
		printf("si");
		break;
	case '5':
		printf("wu");
		break;
	case '6':
		printf("liu");
		break;
	case '7':
		printf("qi");
		break;
	case '8':
		printf("ba");
		break;
	case '9':
		printf("jiu");
		break;
	}
}

一个问题是如何将int转换为char,使用itoa函数在vs里跑的是很舒服,但是pat这个oj不认,会报错,于是使用sprintf,这个是标准库函数,可以用。我在声明两个数组的时候使用的是char a[200], b[5],于是奇怪的bug出现了。我的sprintf函数的参数是用错了。应该是

sprintf(b,"%d", sum);

但我写成了

sprintf(a,"%d", sum);

即sum中的值写入了a而不是b,这样一来b中的值全是未定义,无法输出是对的,而a中从a[0]开始则是sum各位的值。然后呢,由于我使用的是while,找不到\0他就会一直往下找,找完b之后,它去找a了,这说明a的地址是在b之后,而它们是紧紧相连的。只有这样才能在错误的赋值的情况下得到正确的代码。猜想是在debug时会有一个临时的变量堆栈,先把a放进去,再紧接着把b放进去,然后开始跑,而放到pat上时则与此不同。所以会报错。实在是有趣的bug。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值