//360K 32MS G++
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
const int MAX = 1001;
int pos[MAX];
int F, D;
// string res;
char res[MAX];
int repeatLength;
const int LINE_LENGTH = 50;
void printRes(char * res) {
int pos = 0;
int lineLength = 0;
while(res[pos]) {
printf("%c", res[pos++]);
lineLength++;
if (lineLength == LINE_LENGTH) {
printf("\n");
lineLength = 0;
}
}
if (lineLength != 0) {
printf("\n");
}
}
void solve(int F, int D) {
int resPos = 0;
res[resPos++] = '.';
pos[F] = 0;
F *= 10;
while(1) {
int remainder = F%D;
int dRes = F/D;
if (remainder == 0) {
res[resPos++] = dRes + '0';
printRes(res);
printf("This expansion terminates.\n");
return;
} else {
// repeated!
if (pos[remainder] != -1) {
// printf("%d %d dRes %d\n", F, D, dRes);
res[resPos++] = dRes + '0';
printRes(res);
int repeatLength = resPos - pos[remainder] - 1;
printf("The last %d digits repeat forever.\n", repeatLength);
return;
} else {
pos[remainder] = resPos;
res[resPos++] = dRes + '0';
F = remainder*10;
}
}
}
}
int main() {
while(scanf("%d %d", &F, &D) != EOF) {
if (!F && !D) {
return 0;
}
memset(res, 0, sizeof(res));
memset(pos, 0xff, sizeof(pos));
repeatLength = 0;
solve(F, D);
}
}
算是水题吧,如果整体思路清晰,每个变量都很明白意思的话,可以很快出来,不过这类题一般都是要求细节的,
思路就是不断的 乘以10,然后求商和余数,同时维护一个map来记录哪些余数,同时也是下一次的被除数/10, 之前已经出现过了以及出现时对应在除运算结果中的位置,如果出现过,那么必然会出现循环。
还是这道题最后的输出也比较奇葩(满50换行,在输出的时候要注意最后一行正好是50和不是50的区别),要注意一下。