版权声明:转载请附上链接,虽然我都不信有人转。 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++;
}
}