• H


     
       Zty很痴迷数学问题.。一天,yifenfei出了个数学题想难倒他,让他回答1 / n。但Zty却回答不了^_^. 请大家编程帮助他.
    Input第一行整数T,表示测试组数。后面T行,每行一个整数 n (1<=|n|<=10^5).Output输出1/n. (是循环小数的,只输出第一个循环节).
    Sample Input
    4
    2
    3
    7
    168
    Sample Output
    0.5
    0.3
    0.142857
    0.005952380

    直接用浮点型数据计算小数,会导致小数点后精度不够
    而且循环小数无法处理
    故而直接用除法求小数(小学列竖式的除法)
    循环小数的判断条件是:在确定每位小数的时候,判断余数是否出现与之前的相同

    错误版本 :
    #include<stdio.h>
    int T,b[15000],a[15000];
    int main(){
        scanf("%d",&T);
        while(T--){
            int s=10,i,j,r,n;
            int flg=0;
                scanf("%d",&n);
                if(n==0)continue;
                if(n<0){
        
                    printf("-");
                    n*=-1;
                }
                    if(n==1){
                    printf("1
    ");
                    continue;
                } 
                for(i=0;;i++){
                    r=s%n;
                    a[i]=s/n;
                    b[i]=r; 
                    s=10*r;
                    for(j=0;j<i;j++){
                        if(b[j]==r){
                            flg=1;
                            break;
                        }
                    }
                    if(r==0||flg==1)break;
                    }
        printf("0.");
        for(j=0;j<=i;j++){
            printf("%d",a[j]);
        }
        printf("
    ");
        }
        return 0;
    }
    刚开始让s(每次的被除数)=10
    导致 n=3时 第一个余数是10(而不是1)与实际不符
    结果始终无法协调单个数字循环节小数与多个数字循环节小数的位数(因为第一个余数有误)
    在 n=3和n=6 纠结了半天也没搞好,要么是1/3保留两位,要么是1/6只保留一位
    后来仔细写了竖式观察才发现

    改后
    #include<stdio.h>
    int T,b[15000],a[15000];
    int main(){
        scanf("%d",&T);
        while(T--){
            int s=1,i,j,r,n;
            int flg=0;
                scanf("%d",&n);
                if(n==0)continue;
                if(n<0){
        
                    printf("-");
                    n*=-1;
                }
                    if(n==1){
                    printf("1
    ");
                    continue;
                } 
                for(i=0;;i++){
                    r=s%n;
                    a[i]=s/n;
                    b[i]=r; 
                    s=10*r;
                    for(j=0;j<i;j++){
                        if(b[j]==r){
                            flg=1;
                            break;
                        }
                    }
                    if(r==0||flg==1)break;
                    }
        printf("0.");
        for(j=1;j<=i;j++){
            printf("%d",a[j]);
        }
        printf("
    ");
        }
        return 0;
    }

    从 s=1开始 各个数字的余数形式都统一了 ,ac

     



  • 相关阅读:
    表值函数,标量值函数
    考勤率
    精确小数点
    SQL 返回刚插入的值
    xml读取
    备份表
    case,cast
    DDR基础知识
    NXP官方的I.MX6UL板级Uboot源码适配
    高通msm8909打开debug串口
  • 原文地址:https://www.cnblogs.com/-ifrush/p/10059873.html
Copyright © 2020-2023  润新知