Single Round Math sdut3260高精度除以低精度

做高精度除法,从高位开始除。。高位除剩下的我们就*10扔给低一位处理,最终余数是在最低位取模得到的

高精除以高精,我们可以这么做,让除数在后面补零,刚好小于被除数,作若干次减法,减的次数加到商里面

然后如果除数后面有零,我们就去掉一个0,商*=10,直到除数刚好小于被除数,统计减法次数加到商里面

如果我们发现去掉所有零,被除数仍然是小于除数的。。那么我们就做完了除法。。(高精度带余除法

这个题就是算高精度对11取模,。。输出答案别忘了break;

两种解法

高精除以低精

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int s[1005],p[1005];
char a[1005],b[1005];
int main(){
    int T;scanf("%d",&T);
    while(T--){
        scanf("%s%s",a,b);
        int la=strlen(a),lb=strlen(b),flag=0,i,k=11;
        if(la!=lb) {printf("NO\n");continue;}
        for(i=0;i<la;++i){
            if(a[i]!=b[i]) {
                printf("NO\n");flag=1;break;
            }
        }
        if(flag) continue;
        s[0]=la;
        for(i=0;i<la;++i){
            s[i+1]=a[la-i-1]-'0';
        }
        int r;
        for(i=s[0];i>=1;--i){
            if(i==1) r=s[i]%k;
            if(i!=1) s[i-1]+=s[i]%k*10;
            s[i]/=k;
        }
        if(r==0)     printf("YES\n");
        else         printf("NO\n");
    }    
    return 0;
}

直接取模

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int s[1005],p[1005];
char a[1005],b[1005];
int main(){
    int T;scanf("%d",&T);
    while(T--){
        scanf("%s%s",a,b);
        int la=strlen(a),lb=strlen(b),flag=0,i,k=11;
        // printf("(%d,%d)\n",la,lb);
        if(la!=lb) {printf("NO\n");continue;}
        for(i=0;i<la;++i){
            if(a[i]!=b[i]) {
                printf("NO\n");flag=1;break;
            }
        }
        if(flag) continue;
        int ans=0;
        for(i=0;i<la;++i){
            ans=(ans*10+a[i]-'0')%11;
        }
        if(ans==0) printf("YES\n");
        else        printf("NO\n");
    }    
    return 0;
}

 

posted @ 2017-03-19 21:18  狡啮之仰  阅读(441)  评论(0编辑  收藏  举报