数理题
读完题第一次的算法是模拟除法运算,简单算了几个估计只要有3个连续小数与前面有一致的,就说明找到了循环节,这种算法是错误的,有很多特殊情况不能满足,所以一直WA。
WA的代码:
#include <stdio.h> #include <stdlib.h> int main() { int a0,a,b,i,j,x,len,num[100005]={0}; while(scanf("%d%d",&a,&b)!=EOF) { len=0; a0=a; num[0]=a/b; a=(a%b)*10; for (i=1;;i++) { num[i]=a/b; a=(a%b)*10; for (j=1;j<=i-3;j++) { if (num[j]==num[i-2]&&num[j+1]==num[i-1]&&num[j+2]==num[i]) { len=(i-2)-j; x=j; break; } } if (len) break; } printf("%d/%d = %d.",a0,b,num[0]); for (i=1;i<x;i++) printf("%d",num[i]); putchar('('); if (len>50) { for (i=x;i<x+50;i++) printf("%d",num[i]); printf("..."); } else for (i=x;i<x+len;i++) printf("%d",num[i]); putchar(')'); printf("\n %d = number of digits in repeating cycle\n\n",len); } return 0; }
无奈之下看完题解的算法,说什么抽屉原则,反正就是找到有一个余数与前面的一致,就说明找到了循环节,这个算法就满足所有情况,所以果断采用了这种方法。
看大神们都在用C++写,我也开始尝试用C++,第一次用C++ A题,贴出来:
AC代码:
#include <iostream> #include <cstdio> #include <cstring> #define MAX_SIZE 30005 using namespace std; int main() { int a,b,a0,num[MAX_SIZE],q[MAX_SIZE],k;//num用于储存小数,q用于储存余数是否出现过 while(cin>>a>>b) { memset(q,0,sizeof(q)); k=0; a0=a; num[0]=a/b; a=(a%b)*10; while(a&&!q[a]) { num[++k]=a/b; q[a]=k;//顺便记录某余数出现的位置 a=(a%b)*10; } cout << a0 << '/' << b << " = " << num[0] << '.'; if (a) { for (int i=1;i<q[a];i++) cout << num[i]; cout << '('; for (int i=q[a];i<=k&&i<q[a]+50;i++) cout << num[i]; if (k-q[a]+1>50) cout << "..."; cout << ')' << endl; cout << " " << k-q[a]+1 << " = number of digits in repeating cycle" << endl; } else { for (int i=1;i<=k;i++) cout << num[i]; cout << "(0)" << endl; cout << " 1 = number of digits in repeating cycle" << endl; } cout << endl; } return 0; }