zoukankan      html  css  js  c++  java
  • N进制加法实现回文数

    题目描述

    若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
    例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。
    又如:对于10进制数87:
    STEP1:87+78 = 165         STEP2:165+561 = 726
    STEP3:726+627 = 1353  STEP4:1353+3531 = 4884
    在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。

    输入

    第一行是整数N(2<=N<=10或N=16),表是这个数的进制;
    第二行是N进制数M(100位之内),求最少经过几步可以得到回文数。

    输出

    若最少在30步以内得到回文数,则输出步数;
    如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”

    样例输入

    10
    87
    

    样例输出

    4
    

    提示

    十六进制的10-15用A-F表示

    我的解法(吐槽一下,在杭州师范OJ已AC,在登登OJ通过不了emm)

    //30步内求N进制数回文数
    
    #include<stdio.h>
    #include<string.h>
    char str[500];
    char re_str[500];
    int flag=0;
    void renum(){
    
        memset(re_str,'',sizeof(re_str));
        int len=strlen(str);
        for(int i=0;i<len;i++){
            re_str[i]=str[len-1-i];
        }
        if(strcmp(str,re_str)==0) flag=1;
    
    
    }
    void sum(int k){
        int len=strlen(str);
        char temp[120]={'0'};
        int cf=0;
        for(int i=0;i<len;i++){
    
        //
        if(k<10){
            if(str[len-1-i]-'0'+re_str[len-1-i]-'0'+cf>=k){//预判,需要进位
                temp[len-i]=(str[len-1-i]-'0'+re_str[len-1-i]-'0'+cf)%k+'0';
                cf=1;
            }
            else{
                temp[len-i]=(str[len-1-i]-'0'+re_str[len-1-i]-'0'+cf)+'0';
                cf=0;
            }
    
        }
        else{
                //为了方便10进制以上的计算,先全部转化为整数
            int instr,inre_str,intemp;
            if(str[len-1-i]>='A') instr=str[len-1-i]-'A'+10;
            else instr=str[len-1-i]-'0';
    
            if(re_str[len-1-i]>='A') inre_str=re_str[len-1-i]-'A'+10;
            else inre_str=re_str[len-1-i]-'0';
    
            //
            if(instr+inre_str+cf>=k){//有进位
                intemp=(instr+inre_str+cf)%k;
                cf=1;
            }
            else{
                intemp=instr+inre_str+cf;
                cf=0;
            }
            if(intemp>=10) temp[len-i]=intemp-10+'A';
            else temp[len-i]=intemp+'0';
    
        }
    
        }
        if(cf==1){
            temp[0]='1';
            strcpy(str,temp);
    
        }
        else{
            for(int j=0;j<len;j++){
                str[j]=temp[j+1];
            }
        }
    
    
    }
    
    int main(){
        int n;
        scanf("%d",&n);
        if(((n>=2&&n<=10)||n==16)){
            scanf("%s",str);
            int cou=30;
            flag=0;
            while(cou>0){
                renum();//求得当前str的逆序数re_str
                if(flag==1) break;
                sum(n);//将str和re_str求和,结果放在str中
                cou--;
            }
            if(flag==1)printf("STEP=%d
    ",30-cou);
            else printf("Impossible!
    ");
    
        }
    return 0;
    }
  • 相关阅读:
    Odoo电子数据交换(EDI)
    WMS8_仓库配置
    odoo写邮件添加收件人
    Odoo HR Payslip
    openERP邮件(发信、收信)
    Multi-company rules
    MRP Force Reservation的作用
    使用虚拟机VM运行Linux版OpenERP
    采购预付款
    消除递归的方法
  • 原文地址:https://www.cnblogs.com/debug-the-heart/p/12486917.html
Copyright © 2011-2022 走看看