PAT乙级真题1002

版权声明:转载请附上链接,虽然我都不信有人转。 https://blog.csdn.net/gezhishigechuan_/article/details/81749467

1002 写出这个数 (20)(20 分)

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

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

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

输入样例:

1234567890987654321123456789

输出样例:

yi san wu
/*总分20,得分19,在linux下用gcc,对fgets()警告,且运行错误。本人菜鸟,如有高手,还请不吝赐教*/
#include<stdio.h>
#include<string.h>
int get_sum(char* scan_num);
void pin_yin_transfer(int fig);
int main(){
	char ch[100];
	fgets(ch,101,stdin);	//因为获取的数字可能很大,而即便是long long int的最大值也仅为
                            //9223372036854775807远小于题意中的100位,故需要用字符串提取用户
                            //数据 
	if(ch[strlen(ch)-1]=='\n')
		ch[strlen(ch)-1]='\0';
	int sum_num=get_sum(ch);
	int temp=sum_num;
	int sum_num_arr[3];		//用于存放“和”的各个位的数组 ,最多100位,和的MAX=900 
	for(int i=0;i<3;i++){		//依次算出个十百位,并放入数组sum_num_arr 
		sum_num_arr[i]=temp%10;
		temp/=10;
	}
/*	
	printf("个位:%d\n",sum_num_arr[0]);
	printf("十位:%d\n",sum_num_arr[1]);
	printf("百位:%d\n",sum_num_arr[2]); 
*/		
	int first_no_0;//第一个不为0的数 
	int flag=0;
	for(int j=2;j>=0;j--){  //若和的最高位为0则不能打印,只能从和的第一个非零数字打印
		if(sum_num_arr[j]!=0){
			flag=1;
			first_no_0=j;	//得到第一个不为0的数字的位置 
			break;
		}
		else 
			continue;
	}
//	printf("所有位的和sum_num:%d,first_no_0:%d\n",sum_num,first_no_0);
	
	if(!flag)	//若flag为0,则和的所有位均为0 
		pin_yin_transfer(0);			
	else
		for(int k=first_no_0;k>=0;k--){
			if(k==first_no_0)
				pin_yin_transfer(sum_num_arr[k]);
			else{
				printf(" ");
				pin_yin_transfer(sum_num_arr[k]);
			}
		}
	return 0;
}
int get_sum(char* scan_num){	//求数字字符串的和 
	char *p;
	p=scan_num;
	int num_sum=0;
	while(*p!='\0'){
		num_sum+=(*p)-'0';    //以字符串形的数字的ASIC码减去‘0’的ASIC码则为相应数字,char型转
                              //换为int型
		p++;
	}
	return num_sum;
}
/*输入需要转换为拼音的数字,返回拼音首字母的地址 */
void pin_yin_transfer(int fig){
	if(fig>=1e100)
		return;
	char pin_arr[][5]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};//二维数                
  //组,每个数字的拼音都占用一行,列数最多的是“ling”+'\0'.字符串最多有5列。
	char* str_to_fig;
	str_to_fig=pin_arr[fig];
	while(*str_to_fig!='\0'){
		printf("%c",*str_to_fig);
		str_to_fig++;
	} 
}

猜你喜欢

转载自blog.csdn.net/gezhishigechuan_/article/details/81749467