PAT Basic Level 1002
题目:
思路:1.输入的数据大小巨大无法用int,double类型保存并且题设要求需要读取每位上的数字所以选择用char数组保存。将其每位相加后用printchn函数打印出。
2.pringchn函数:读入一个数字,我们要先输出的最高位,呢么如何获取他的最高位?例 a = 1234,如何先获取1呢?显然将 a / 1000,呢么如何得到1000呢?
a. 设置mask = 1; 让a不停除以10知道得到0为止,每除以一次10,mask * 10。 a = a / 10 = 123,mask *= 10; a = a / 10 = 12 mask *= 10....
注意最后得到的mask 大一位 a = 1234 ,mask = 10000,最后需要将mask / 10。
b. 得到mask后利用a / mask 得到最高位 ,每次做完 另 a = a%mask,mask /= 10;
重点思考数字中的零和末尾的零是否有影响。
1.在求mask的过程中:即使中间或末尾有零皆不影响,因为只有当a = 0时才停止mask自乘。例:a = 10450, a = 1045 ,a= 104 , a = 10,a = 1,a = 0,
2.在正序取出每位数字时:重点注意结束条件不是 a != 0 而是 mask != 0;例:a = 10000,mask = 10000; a = 10000 / mask = 1, mask /= 10 = 1000;a = 1 / mask = 0,mask /= 10 = 100;a = 0 / mask = 0,mask /= 10 = 10;a = 0 / mask = 0,mask /= 10 = 1; a = 0/mask = 0,mask /= 10 = 0;
AC代码
1 #include <stdio.h> 2 void PrintChn(int num) 3 { 4 int cnt = 0; 5 int tempNum = num; 6 while (tempNum>0) 7 { 8 tempNum = tempNum/10; 9 cnt++; 10 } 11 int i; 12 int mask = 1; 13 for(i = cnt;i > 0;i--) 14 { 15 mask *= 10; 16 } 17 mask = mask/10; 18 while (mask != 0) 19 { 20 int temp = 0; 21 temp = num/mask; 22 num = num % mask; 23 mask = mask/10; 24 switch (temp) 25 { 26 case 0:printf("ling"); 27 break; 28 case 1:printf("yi"); 29 break; 30 case 2:printf("er"); 31 break; 32 case 3:printf("san"); 33 break; 34 case 4:printf("si"); 35 break; 36 case 5:printf("wu"); 37 break; 38 case 6:printf("liu"); 39 break; 40 case 7:printf("qi"); 41 break; 42 case 8:printf("ba"); 43 break; 44 case 9:printf("jiu"); 45 break; 46 } 47 if(mask>0) 48 { 49 printf(" "); 50 } 51 } 52 } 53 int main () 54 { 55 char box[100]; //define "box"char array for input num; 56 scanf("%s",&box); 57 int temp = 0; 58 int i = 0; 59 while(box[i] != 0) 60 { 61 temp += (int)box[i] - '0'; 62 i++; 63 } 64 PrintChn(temp); 65 return 0 ; 66 67 }