//题目:
1002 写出这个数
分数 20
全屏浏览题目
切换布局
作者 CHEN, Yue
单位 浙江大学
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10100。
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
输出样例:
yi san wu
过程:起初以为只要不断去个位就好,但是测试用例长度超出long long;
SWAP1:
#include <stdio.h>
int main()
{
long long input = 0;
scanf("%ld", &input);
long long yu = 0;
long long sum = 0;//初始化
while (input != 0)
{
yu = input % 10;
input = input / 10;
sum = sum + yu;//削掉个位
}
printf("%ld", sum);
return 0;
过程:为避免长度问题,改用getchar;
SWAP2:
1
#include <stdio.h>
int main()
{
int sum = 0;
int i = 0;
//初始化
while (getchar() != '\n')//判定
{
sum = sum + getchar()-'0';//加和
}// 问题:在使用getchar判定的时候没有意识到判定时已经读取了一个字符;
//结果:1、输入为奇数位,第二个getchar()吃掉'\n',导致需要再次输入;
// 2、输入为偶数,但判定时已经读取一个字符,设数abcdefgh,结果只会是
//b+d+f
printf("%d", sum);
return 0;
}
2为避免上述问题,尝试将getchar()放进数组,由数组元素进行判定,由getchar()进行
读取
#include <stdio.h>
int main()
{
int sum = 0;
int count = 0;
char arr[1000] = {'0'};
//初始化
int i = 0;
do
{ arr[i] = getchar();
i = i + 1;//存放数组
} while (arr[i-1] != '\n');//用数组判定
arr[i-1]='0';
for (int j = 0; j <= i-2; j++)
{
sum = sum + (arr[j] - '0');//循环加和
}
printf("%d", sum);
return 0;
}
3认为用数组存放而后判定较为麻烦,在同学建议下改用scanf
#include <stdio.h>
int main()
{
char input = '0';
scanf("%c", &input);
int sum = 0;
while (input != '\n')
{
sum = sum + input-'0';
scanf("%c", &input);
}
printf("%d", sum);
return 0;
}
自此数据的转化完成
接下来是拼音的实现
最初打算采用switch,先将各个位的数字放入数组,再用for循环
逆序
SWAP1:
int main()
{
int arr[101] = { 0 };
int a = 0;
scanf("%d", &a);
int i = 0;
while (a != 0)
{
arr[i] = a % 10;
a = a / 10;
i++;
}
for (i = i - 1; i >= 0; i--)
{
switch (arr[i])
{
case 1:
{
printf("yi");
if (i != 0)
printf(" ");
break;
}
case 2:
{
printf("er");
if (i != 0)
printf(" ");
break;
}
case 3:
{
printf("san");
if (i != 0)
printf(" ");
break;
}
case 4:
{
printf("si");
if (i != 0)
printf(" ");
break;
}
case 5:
{
printf("wu");
if (i != 0)
printf(" ");
break;
}
case 6:
{
printf("liu");
if (i != 0)
printf(" ");
break;
}
case 7:
{
printf("qi");
if (i != 0)
printf(" ");
break;
}
case 8:
{
printf("ba");
if (i != 0)
printf(" ");
break;
}
case 9:
{
printf("jiu");
if (i != 0)
printf(" ");
break;
}
case 10:
{
printf("shi");
if (i != 0)
printf(" ");
break;
}
default:break;
}
}
return 0;
}
因过于长而舍弃;
后尝试把拼音放进数组:
SWAP2
int main()
{
char input = '0';
scanf("%c", &input);
int sum = 0;
int ge = 0;
int arr[10] = { 0 };
int i = 0;//初始化
while (input != '\n')
{
sum = sum + input - '0';
scanf("%c", &input);//各位加和
}
//printf("%d", sum);
while (sum != 0)
{
arr[i] = sum % 10;//对加出来的sum取出各个位
i++;
sum = sum / 10;
}
const char* list[10] = { "ling","yi","er","san","si","wu","liu","qi","ba","jiu" };//把拼音存放到数组里
for (int j = i-1 ; j >= 0; j--)
{
printf("%s", list[arr[j]]);//取代switch
if (j > 0)
printf(" ");
}
return 0;
}
PTA第二题结束。