UVa202 Repeating Decimals

#include<stdio.h>
#include<string.h>
int figure[10000];
int as[10000];
int main(){
        int a,b,itg;
        while(scanf("%d%d",&a,&b)!=EOF){
            memset(figure,0,sizeof(figure));
            memset(as,0,sizeof(as));
              int m,n;
              int a1;
              a1 = a;
              itg = a/b;
              a = a%b;
              as[0] = a;
              for(int i = 0 ; i<10000 ; i++){
                 figure[i] = a*10/b;
                 a = a*10%b;
                 as[i+1] = a ;
                 for(int j = 0 ; j<i+1 ; j++){               //可以换成一个不需要for循环的方法:
                      if(a==as[j]){                                 //新建一个int str[1000]; 让str[a]++
                           m = i+1;                               //再查找str[a]是否为1;
                           n = j;
                           goto end;
                      }
                 }
              }
             end: if(m-1<=50){
                 printf("%d/%d = %d.",a1,b,itg);                          //怎样将“(”加入
                 for(int i = 0 ; i<m ; i++){
                    if(i==n)  printf("(");
                    printf("%d",figure[i]);
                    if(i==m-1) printf(")\n");
                 }
              }else{
                  printf("%d/%d = %d.",a1,b,itg);                          //怎样将“(”加入
                  for(int i = 0 ; i<51 ; i++){
                    if(i==n)  printf("(");
                    if(i==50)
                    {
                        printf("...)\n");
                        break;
                    }
                    printf("%d",figure[i]);
                  }
              }
              printf("   %d = number of digits in repeating cycle\n\n",m-n);
    }
}


/*
      1. 输入a,b
      2. 整数部分 int itg , 小数部分 int figure[10000] ;  存放a的数组 a[10000] ;int m,n; 分别为循环小数的起始位置与终止位置
      3.     itg = a/b;
              a = a%b;
              a[0] = a;

              for(int i = 0 ; i<10000 ; i++){
                 figure[i] = a*10/b;
                 a = a*10%b;
                 a[i+1] = a ;
                 for(int j = 0 ; j<i+1 ; j++){               //可以换成一个不需要for循环的方法:
                      if(a==a[j]){                                 //新建一个int str[1000]; 让str[a]++
                           m = i+1;                               //再查找str[a]是否为1;
                           n = j;
                           goto end;
                      }
                 }
              }
              if(m-1<=50){
                 printf("%d/%d=%d.",a,b,itg);                          //怎样将“(”加入
                 for(int i = 0 ; i<m ; i++){
                    if(i==n)  printf("(");
                    printf("%d",figure[i]);
                    if(i==m-1) printf(")\n");
                 }
              }else{
                  printf("%d/%d=%d.",a,b,itg);                          //怎样将“(”加入
                  for(int i = 0 ; i<51 ; i++){
                    if(i==n)  printf("(");
                    printf("%d",figure[i]);
                    if(i==50) printf("...)\n");
              }
              printf("   %d=number of digits in repeating cycle\n",m-n);
*/
/*
     注意点:
                  1.对于小数部分可以像我们平常自己算小数一样让计算机去学习计算
                  2.在寻找周期串时,可以使用像上方所提到的,利用srt[a]++的方法,就不需要使用循环
                  3.三次presentation error 分别为: (1) 等号两边有空格
                                                                      (2) 每一个输出中还存在着一个空行、
                                                                      (3) 看清楚题目,以为如果超过50个小数位则从开头就
                                                                      输入左括号,其实有个cycle在题目中明确提出
                                                            (1) (2) 看题目输出格式 (3)看题目中output要求
 */

猜你喜欢

转载自blog.csdn.net/m0_37632283/article/details/80384931