IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 学习日记-C语言实现pat乙级1002(写出这个数) -> 正文阅读

[C++知识库]学习日记-C语言实现pat乙级1002(写出这个数)

学习日记-C语言实现pat乙级1002(写出这个数)

最终通过代码(1)

#include <stdio.h>
#include <malloc.h>

char* input(void);
int qsum(char* a);
void output(int t);

int main(void)
{
	char* num = input();
	int sum = qsum(num);
	free(num);
	output(sum);

	return 0;
}

char* input(void)
{
	char* num = (char*)malloc(100);
	scanf("%s", num);
	return num;
}
int qsum(char* num)
{
	int sum = 0;
	for (int i = 0; i < strlen(num); i++)
	{
		sum += num[i] - 48;
	}

	return sum;
}
void output(int t)
{
	char* py[10] = { "ling","yi","er","san","si","wu","liu","qi","ba","jiu" };
	int baiwei = 0, shiwei = 0, gewei = 0;
	if (t >= 100)
	{
		gewei += t % 10;
		t /= 10;
		shiwei += t % 10;
		t /= 10;
		baiwei = t;
		printf("%s ", py[baiwei]);
		printf("%s ", py[shiwei]);
		printf("%s", py[gewei]);

	}
	else if (t >= 10)
	{
		gewei += t % 10;
		t /= 10;
		shiwei = t;

		printf("%s ", py[shiwei]);
		printf("%s", py[gewei]);
	}
	else
	{
		printf("%s", py[t]);
	}
}

为了让代码更加整洁,增强程序可读性,用了三个函数,但是耗时却增加了。。

三个函数最后一个版本

最终通过代码(2)

#include <stdio.h>
void input(int * input)
{
	scanf("%s", input);
}
int main(void)
{
	char num[100];
	input(num);

	int n =strlen(num);

	char sum[100];
	int i;
	int output = 0;
	for (i=0;i<n;i++)
	{
		sum[i] = num[i]-48;
		output += sum[i];
	}

	char* py[10] = { "ling","yi","er","san","si","wu","liu","qi","ba","jiu" };
	int gewei = 0, shiwei = 0, baiwei = 0;

	if (output > 100)
	{
		gewei += output % 10;
		output /= 10;
		shiwei = output % 10;
		output /= 10;
		baiwei += output;

		printf("%s ", py[baiwei]);
		printf("%s ", py[shiwei]);
		printf("%s", py[gewei]);

	}

	else if (output >= 10)
	{
		gewei += output % 10;
		output /= 10;
		shiwei = output;

		printf("%s ", py[shiwei]);
		printf("%s", py[gewei]);
	}
	else
	{
		gewei = output;
		printf("%s", py[gewei]);
	}
	return 0;
}

因为想的模块化就想分为三部分,输入,运算操作,输出;

但只写了一个输入函数,发现其它不太好写就先没写,不过只写一个还不如不写。

第一版本

未通过代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
#include <string.h>

char tiqu(char ch)
{
	int a;
	//printf("%d", ch - 48);
	a = ch - 48;
	return a;
}

void output(int s)
{
	if (s == 0)
		printf("ling");
	else
	{
		int sum = 0;
		while (s) //这里是用的判断回文的方法,将数字倒过来。
		{
			sum = sum * 10 + s % 10;
			s /= 10;
		}
	//	printf("%d", sum);
		int a;
		while (sum > 0)
		{
			a = 0;
			a = a + sum % 10;
			switch (a)
			{
			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;

			}
			sum = sum / 10;

			if ((sum % 10) != 0 ) //发现每一个拼音后必须要有空格,但是最后一个还不能有空格,于是加了一个if语句
			printf(" ");
		}
		
		//printf("\b");//这是一开始没用if语句,为了把最后一个空格删掉,在最后加了一个退格的转义字符,但是在oj里不可行!
	}
}
int main(void)
{
	char input[100];
	scanf("%s", input);

	int i, n;
	int sum = 0;
	n = strlen(input);
	for (i = 0; i < n; i++)
	{
		sum += tiqu(input[i]);
	}
	//printf("%d\n", sum);
	output(sum);

	return 0;
}

未通过版本总结

这个版本是最先提交的版本,有一个检测点无法通过,扣一分;虽然扣一分,但错误很严重。

这个版本的bug是,求和以后,没有考虑要输出到“yi ling ling” “er ling”,101,100,10 等等这样的中间和末尾有零的数字!

一开始敲出来,用了%取余运算符,把数字一位一位的从个位依次取出。但是这样取出的数字是从个位开始,输入样例会出现wu san yi这样的情况,于是想到了用while判断回文数字的方法,把数字倒过来再从个位开始读取。

结果这样做会导致,本来100正确输出为yi ling ling,但倒过来成了001,输出就成了 “yi”

在参考他人代码和再次读题后发现:

题干中说明 n小于10的100次方,由这句可以得到两个结论:

1.输入数字的个数最多不大于100个数字;

2.每个数字是0~9

因为是将每一位数字相加之和,结合以上两个结论得出:

相加后的数字最大就是10*100-1,也就是999;意味着最多是三位数字,可以用个位,十位个位,百位十位个位表示;

总结体会

指针数组,字符串数组,这部分内容掌握不行!char* py[10] = { "ling","yi","er","san","si","wu","liu","qi","ba","jiu" };是写成这道题关键之一!

对与数据类型范围没有大概认知,一开始还用int和long long去存储样例输入;

解题思路

1.输入数字

(1).以字符串的格式输入数字;

(2).存储于字符数组中;(会以'1' '2' '3' '4' '5' '6' '\0'这样一个字符一个字符末尾加\0存储,类似以%s输入hello,在字符数组中会成为'h' 'e' 'l' 'l' 'o' ‘\0’

2.运算操作(把每一位数字相加);

(1)将字符数组中保存的数字字符(图形)一个一个取出;用for循环取出,但不取出最后一个'\0'(用strlen()函数获取字符串长度(不计算空字符’\0’))

(2)相加(因为是以字符%s的形式输入,键盘输入0相当于输入的是十进制数字48,要转为真正的数字0要减去48)这里涉及到ascii码,例:图形1对应的ascii码是49

3.输出结果

(1)将相加的和分为三类1.百位十位个位,2.十位个位3.个位(用if…else if…else);

(2)将每一位取出并输出(注意:别忽略100,10的情况);

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-29 08:54:26  更:2021-08-29 08:56:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 20:41:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计