PAT 乙级(1002.读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。)【c++更新版】

这篇博客介绍了如何使用C语言处理大数相加的问题,通过数组存储大数并进行反转排序,然后将计算结果转换为中文数字发音。博主分享了学习C语言的心得,并对比了C++版本的简洁之处。

有一个运行错误不知道什么意思,感觉差不了多少反正就一分。

我的总结:

1. 题目中的 n 可以非常大,n 可以有100位之多。很显然用 int 型不够的,

甚至 long long int 都是不够的。所以我去b站找视频发现可以用数组来存储数据。 

(大数加法 B站号 BV1jE411j7xn)

char a[29], b[29];
int sum=0,i;
scanf("%s",a);
for(sum=0,i=strlen(a)-1; i>=0; i--,sum++)
 { b[sum]=a[i]-'0';  }

这一串代码意思就是:先定义数组然后输入字符123456(它们在ASKII里面都有自己的值). 但我们要的是数字不是字符,所以

需要  a[i]  -  '0'  这样 b[sum] 里面存的就是数字了。

2.接下来就是数字的排序了,(将数字的前后颠倒531->135)

while(sum>0){
sum/=10; 
j++; } 
for(j;j>0;j--){
k=k+temp%10;
temp/=10;
 for(i=1;i<j;i++){
k*=10;}
sum=sum+k;
k=0;}

第一个whlie 语句判断有数字有 J 位。

第一个for 循环

把每一位的值提出来(用题目答案来举例子)

当 J = 3时 k = 0 + 531%10 = 1

第二个个for循环

判断应该乘以几遍10

i=1;i<3; i++

k乘以两遍10,k=100

sum是最终的值,把每一次循环出来的 k 值加起来就行了(k每次都要等于一遍 0).

3.接着就是一个小小的Switch语句来选择输出那个数字拼音,和一个if 语句判断要不要输出空格。

while(sum>0) {
		i=sum%10;
		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;
		}
		sum=sum/10;
		if(sum!=0){
			printf(" ");
		}
		i=0;
	}

所有代码:

#include <stdio.h>
#include <string.h>
int main() {
	char a[29], b[29];   
	int sum=0,i, n,temp,j=0,k=0;
	scanf("%s",a);
	for(sum=0,i=strlen(a)-1; i>=0; i--,sum++) {
		b[sum]=a[i]-'0';
	}
	i=0;
	sum=0; 
	for(i=0; i<strlen(a); i++) {  
		sum+=b[i];  
	}temp=sum;   
	while(sum>0){
		sum/=10; 
		j++;
	} sum=0;
		for(j;j>0;j--){
		k=k+temp%10;
		temp/=10;
		 for(i=1;i<j;i++){
		  k*=10;}
		  sum=sum+k;
		  k=0;}
	i=0;
	while(sum>0) {
		i=sum%10;
		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;
		}
		sum=sum/10;
		if(sum!=0){
			printf(" ");
		}
		i=0;
	}
}


初上大一是新手,刚学习C语言还不久。想写点题来练练手,希望可以来交流。

(大学老师真不像初中高中,老师比我还忙╮(╯▽╰)╭。每次问题只能在网上解答,看解析看得我是累得很,真希望可以交流一下病情)

C++ AC版  2022 / 11 / 28

c++真方便!

#include <bits/stdc++.h>
#include <iostream>
#include <stdlib.h>
#include <algorithm>
#include <deque>

using namespace std;
int main()
{
    string s;
    cin >> s;
    int ans;
    for (int i = 0; i < s.size(); i++)
    {
        ans += s[i] - '0';
    }
    string temp = to_string(ans);//int 型  转字符型
    for (int i = 0; i < temp.size(); i++)
    {
        switch (temp[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;
        }
        if (i == temp.size() - 1)
            break;
        printf(" ");
    }
    system("pause");
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值