C++:PAT 1002 写出这个数 读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

1002 写出这个数 C++

题目

读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

输入格式:

每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 1 0 100 10^{100} 10100

输出格式:

在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。

输入样例:

1234567890987654321123456789
结尾无空行

输出样例:

yi san wu
结尾无空行

代码存档

1.while方法

#include<iostream>
int main()
{
	using namespace std;
	const int ArSize = 100;
	const int ArSize2 = 3;
	char mathin1[ArSize];
	int mathin2[ArSize2];
	int sum1 = 0;
	int i = 0;
	int j = 0;

    //储存求和
	cin.get(mathin1[i]);//读取第一个数字
	while (mathin1[i] != '\n')//读取数字,并求和
	{
		switch (mathin1[i])//转换,将字符转换为数字
		{
		case '0':sum1 += 0; break;
		case '1':sum1 += 1; break;
		case '2':sum1 += 2; break;
		case '3':sum1 += 3; break;
		case '4':sum1 += 4; break;
		case '5':sum1 += 5; break;
		case '6':sum1 += 6; break;
		case '7':sum1 += 7; break;
		case '8':sum1 += 8; break;
		default:sum1 += 9;
			break;
		}
		i++;
		cin.get(mathin1[i]);//读取下一位
	};
    //分解总和
	while (sum1 > 0)//判断条件:sum1(各位数之和)大于零。分解步骤
	{
		mathin2[j] = sum1 % 10;//对sum1取余数,读取尾数保存到数组中,把数分离
		sum1 /= 10;//将suml除10,下次取余位向前进一位
		j++;
	};
	j--;
    //输出拼音数字
	while(j>=0)
	{
		switch (mathin2[j])
		{
		case 0:cout << "ling"; break;
		case 1:cout << "yi"; break;
		case 2:cout << "er"; break;
		case 3:cout << "san"; break;
		case 4:cout << "si"; break;
		case 5:cout << "wu"; break;
		case 6:cout << "liu"; break;
		case 7:cout << "qi"; break;
		case 8:cout << "ba"; break;
		case 9:cout << "jiu"; break;
		};
		if (j != 0)
			cout << " ";
		j--;
	};
	return 0;
}

结果

提交时间 状态 分数 题目 编译器 耗时 用户
2021/07/31 17:06:34 答案正确 20 编程题 C++ (clang++) 7 ms
测试点 结果 分数 耗时 内存
0 答案正确 12 6 ms 440 KB
1 答案正确 1 6 ms 320 KB
2 答案正确 1 5 ms 320 KB
3 答案正确 2 7 ms 456 KB
4 答案正确 2 6 ms 376 KB
5 答案正确 2 6 ms 320 KB

步骤:

步骤

根据题目,我们需要向程序里输入不大于10^100的正整数n,将它的各位数进行求和,要求用拼音数字表示和的各位数,拼音数字之间有一位空格,尾端没空格。

首先,需要一个容器来储存这个可能非常大的数字,这个数的上限是10^100。

其次,将这个数的各位数进行求和,这就需要把数的各个位拆开储存以方便求和。

再次,需要将和的各位数转换为拼音数字输出,这就需要建立各位数与拼音数字的联系。

最后,在每个拼音数字后面输出一位空格,最后一位拼音数字不输出。

采用数组,可以储存非常大的数,而数组内部分开储存的特性,也可以分割数上的各位数。

那么,应该将数组声明位何种格式呢?

我在这里将这个数组声明为了char类型,将这一串数字看成了字符串,利用字符串数组只读取一个字符的特性,将这串数拆开。

思路:虽然字符的数字,与算术的数字在计算机上内在不一样,但在我们人看来,形式是一样的,我们可以认为建立同种形状的字符数字和算术数字之间的联系,实现转换,最后利用这种联系,再进行转换,进行求和。

数字转换

代码实现

//储存求和
cin.get(mathin1[i]);//读取第一个数字
	while (mathin1[i] != '\n')//读取数字,并求和
	{
		switch (mathin1[i])//转换,将字符转换为数字
		{
		case '0':sum1 += 0; break;
		case '1':sum1 += 1; break;
		case '2':sum1 += 2; break;
		case '3':sum1 += 3; break;
		case '4':sum1 += 4; break;
		case '5':sum1 += 5; break;
		case '6':sum1 += 6; break;
		case '7':sum1 += 7; break;
		case '8':sum1 += 8; break;
		default:sum1 += 9;
			break;
		}
		i++;
		cin.get(mathin1[i]);//读取下一位
	};

我们可以很轻松的算出这串数各位数之和的最大值是多少,99*9=891,是一个三位数,可以对其取余将和从右向左分割。

代码实现

	while (sum1 > 0)//判断条件:sum1(各位数之和)大于零。分解步骤
	{
		mathin2[j] = sum1 % 10;//对sum1取余数,读取尾数保存到数组中,把数分离
		sum1 /= 10;//将suml除10,下次取余位向前进一位
		j++;
	};
	j--;

已经分割完的和储存再数组里,用switch建立数与拼音数字的联系,从而将其输出。

由于最后一位在数组上的位置是0,可以加一个条件为 数组位数是否等于0的 判断语句来控制输出空格。

代码实现

    //输出拼音数字
	while(j>=0)
	{
		switch (mathin2[j])
		{
		case 0:cout << "ling"; break;
		case 1:cout << "yi"; break;
		case 2:cout << "er"; break;
		case 3:cout << "san"; break;
		case 4:cout << "si"; break;
		case 5:cout << "wu"; break;
		case 6:cout << "liu"; break;
		case 7:cout << "qi"; break;
		case 8:cout << "ba"; break;
		case 9:cout << "jiu"; break;
		};
		if (j != 0)
			cout << " ";
		j--;//改变循环条件
	};

2.运用指针

#include<iostream>
int main();
const char* pin[10] = { "ling","yi","er","san","si","wu","liu","qi","ba","jiu" };
int main()
{
	using namespace std;
	char* figure = new char[100];
	int sum = 0;
	int* sum1 = new int[3];
	int i = 0, j = 0;

	cin.get(figure[0]);
	while (figure[i] != '\n')
	{
		sum = sum+ int(figure[i] - '0');
		i++;
		cin.get(figure[i]);
	}
	while (sum>0)//分割总和
	{
		sum1[j] = sum % 10;
		sum /= 10;
		j++;
	}
	j--;
	while (j>=0)
	{
		cout << pin[sum1[j]];
		if (j)
			cout << " ";
		j--;
	}
    return 0;
}
提交时间 状态 分数 题目 编译器 耗时 用户
2021/08/01 12:54:29 答案正确 20 编程题 C++ (g++) 5 ms
测试点 结果 分数 耗时 内存
0 答案正确 12 5 ms 432 KB
1 答案正确 1 5 ms 324 KB
2 答案正确 1 5 ms 316 KB
3 答案正确 2 4 ms 316 KB
4 答案正确 2 4 ms 452 KB
5 答案正确 2 5 ms 320 KB

3.删去指针

#include<iostream>
int main();
const char* pin[10] = { "ling","yi","er","san","si","wu","liu","qi","ba","jiu" };
int main()
{
	using namespace std;
	char figure[1000];
	int sum = 0;
	int sum1[3];
	int i = 0, j = 0;

	cin >> figure;
	while (figure[i] != '\0')
	{
		sum = sum + int(figure[i] - '0');
		i++;
	}
	while (sum > 0)
	{
		sum1[j] = sum % 10;
		sum /= 10;
		j++;
	}
	j--;
	while (j >= 0)
	{
		cout << pin[sum1[j]];
		if (j)
			cout << " ";
		j--;
	}
}

结果:

提交时间 状态 分数 题目 编译器 耗时 用户
2021/08/01 12:47:44 答案正确 20 编程题 C++ (g++) 5 ms
测试点 结果 分数 耗时 内存
0 答案正确 12 4 ms 316 KB
1 答案正确 1 4 ms 300 KB
2 答案正确 1 4 ms 316 KB
3 答案正确 2 4 ms 312 KB
4 答案正确 2 5 ms 320 KB
5 答案正确 2 5 ms 304 KB

参考博客:

  1. 1002 写出这个数 (20分) 读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。_理智的益达的博客-CSDN博客

  2. C++ PAT 乙级 ——1002 读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。_striveAgain丶的博客-CSDN博客

  3. c++ pat 乙级 -------1002 读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。_Jibert的博客-CSDN博客

猜你喜欢

转载自blog.csdn.net/GrowlR/article/details/119297161