Time Limit: 500MS | Memory Limit: 10000K | |
Total Submissions: 71191 | Accepted: 16721 |
??? 本題總的來說并不是很難,但是卻很麻煩,我在北大上做題時(shí)wrong了n次,最終總算通過了,我不知道大牛們是怎么做的,但是我的做法的確是很麻煩
??? 思想是:就是將輸入的自然數(shù)a去掉小數(shù)點(diǎn)后,然后進(jìn)行n次大整數(shù)相乘,每次的乘數(shù)是輸入以后去掉小數(shù)點(diǎn)的a,被乘數(shù)是前面乘過以后的結(jié)果。在結(jié)束完n次以后將小數(shù)點(diǎn)加到合適的位置,并進(jìn)行前后的除零。
代碼:
?
1 #include < stdio.h >
2 #include < string .h >
3 ? int main()
4 {
5 int i,j,sum,k,res[ 500 ][ 500 ],flag = 0 ,b,dox,mark,deadline,t;
6 char result[ 500 ],a[ 65 ],tran[ 500 ];
7 while (scanf( " %s " ,a) != EOF)
8 {
9 sum = 0 ;k = 0 ;dox = 0 ;mark = 0 ;
10 memset(result, 0 , sizeof (result));
11 result[ 0 ] = ' 1 ' ;
12 getchar();
13 scanf( " %d " , & b);
14 int len1 = strlen(a);
15 if (a[ 0 ] == ' 0 ' )
16 {
17 for (i = 2 ;a[i] != ' \0 ' ;i ++ )
18 a[i - 2 ] = a[i];
19 len1 -= 2 ;
20 dox = len1;
21 a[len1] = ' \0 ' ;
22 }
23 else
24 {
25 for (i = 0 ;a[i] != ' \0 ' ;i ++ )
26 {
27 if (a[i] == ' . ' )
28 {
29 mark = 1 ;
30 len1 -- ;
31 continue ;
32 }
33 if (mark)
34 {
35 a[i - 1 ] = a[i];
36 dox ++ ;
37 }
38 }
39 a[len1] = ' \0 ' ;
40 }
41 for (t = 1 ;t <= b;t ++ )
42 {
43 memset(res, 0 , sizeof (res));
44 int len2 = strlen(result);
45 strcpy(tran,result);
46 for (i = 0 ;i < len2;i ++ )
47 result[i] = tran[len2 - 1 - i];
48 k = 0 ;sum = 0 ;
49 for (i = 0 ;i < len1;i ++ )
50 for (j = 0 ;j < len2;j ++ )
51 res[i][j] = (a[i] - ' 0 ' ) * (result[j] - ' 0 ' );
52 for (i = len1 - 1 ;i >= 0 ;i -- )
53 {
54 for (j = len2 - 1 ;j >= 0 ;j -- )
55 sum = sum + res[i + len2 - j - 1 ][j];
56 result[k] = sum % 10 + ' 0 ' ;
57 k = k + 1 ;
58 sum = sum / 10 ;
59 }
60 for (i = len2 - 2 ;i >= 0 ;i -- )
61 {
62 for (j = 0 ;j <= i;j ++ )
63 sum = sum + res[i - j][j];
64 result[k] = sum % 10 + ' 0 ' ;
65 k = k + 1 ;
66 sum = sum / 10 ;
67 }
68 if (sum != 0 )
69 {
70 result[k] = sum + ' 0 ' ;k = k + 1 ;
71 }
72 }
73 dox = dox * b;
74 int len = strlen(result);
75 if (dox != 0 )
76 {
77 if (dox <= len - 1 )
78 {
79 for (i = len - 1 ;i >= dox;i -- )
80 result[i + 1 ] = result[i];
81 result[dox] = ' . ' ;
82 len ++ ;
83 }
84 else
85 {
86 result[dox] = ' . ' ;
87 for (i = dox - 1 ;i > len - 1 ;i -- )
88 result[i] = ' 0 ' ;
89 }
90 }
91 deadline = 0 ;
92 len = len - 1 > dox ? len - 1 :dox;
93 for (i = 0 ;i <= len;i ++ )
94 {
95 if (result[i] != ' 0 ' )
96 {
97 if (result[i] == ' . ' )
98 deadline = i + 1 ;
99 else
100 deadline = i;
101 break ;
102 }
103 }
104 mark = 0 ;
105
106 for (i = len;i >= deadline;i -- )
107 if (mark == 1 || result[i] != ' 0 ' )
108 {
109 mark = 1 ;
110 printf( " %c " ,result[i]);
111 }
112 printf( " \n " );
113 }
114 return 0 ;
115 }
116
???? (注意:) 我在之前wrong了幾次,主要是少考慮了幾種情況,經(jīng)過某位大牛的指點(diǎn)才能通過,此大牛給出的例子是 :
??????????????????? 4.000 2? 結(jié)果應(yīng)該是16 并非16.
?????????????????? ?10.000 2 結(jié)果應(yīng)該是100 并非是1或者100.
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
