PAT 1002

邮差的信 提交于 2019-12-23 04:05:14

PAT 1002 写出这个数

我的解法

#include<stdio.h>
#include<stdlib.h>
int pin[100]={};
int printpin(int i)
{
    switch (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;
    default:
        break;
    }
    return 0;
}
int main()
{
    long long num;
    int sum=0;
    int temp;           //temp用来记录一位数字
    int count=0;        //计数器count,记录sum有多少位

    int i=0;
    scanf("%lld",&num);
    while(num)
    {
        temp=num%10;
        sum+=temp;
        num/=10;
    }
    //printf("%d\n",sum);
    while(sum)
    {
        pin[i]=sum%10;
        i++;
        sum=(sum-sum%10)/10;
    }
    count=i-1;
    for(count;count>=0;count--)
    {
        printpin(pin[count]);
        printf(" ");
    }
    return 0;
}

此题要求输入一串数字,求各位数和,再用拼音显示出来
我的想法是,定义一个long long类型的num,通过scanf输入,给num赋值,再利用循环,逐位的取余数,再累加,求出和,这样的做法也没错

后来我参考了其他人的方法,

char* bignumber=(char*)calloc(105,sizeof(char));
	scanf("%s",bignumber);
	int sum=0;
	for(int i=0;i<strlen(bignumber);i++)
		sum+=bignumber[i]-'0';

输入的一串数字设置为字符串,再通过循环依次减去0的ASCII码,得到数字,直接累加,计算出sum

与我的处理方法对比

scanf("%lld",&num);
    while(num)
    {
        temp=num%10;
        sum+=temp;
        num/=10;
    }
    //printf("%d\n",sum);
    while(sum)
    {
        pin[i]=sum%10;
        i++;
        sum=(sum-sum%10)/10;
    }

我定义了long long类型的num,明显在时间复杂度与代码上相比,均要更加复杂
在求拼音的时候,我通过对pin[]数组的倒序遍历,调用printpin()函数,使用switch-case结构,来寻找对应的拼音

int printpin(int i)
{
    switch (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;
    default:
        break;
    }
    return 0;
}

参考他人的方法,通过定义字符数组来存储10个拼音,操作起来更为简便

char sp[10][5]={“ling”,“yi”,“er”,“san”,“si”,“wu”,“liu”,“qi”,“ba”,“jiu”};

通过下标的对应,来寻找拼音

心得

这道题我的方法没有错误,只是最普通、最常见的思路,依次取末位数,再累加,求和后,也是依次取末位数,再通过switch-case结构来挑选。
通过参考代码

  1. 多位数求各位和:
    利用字符串来存储,再通过下标,依次减去‘0’,累加,即得到各位数和
    2.两组有序的有规律的数据,可通过数组对应数组来查找一一对应,不必要利用switch-case结构
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!