高精n进制加法

Powered by:AB_IN 局外人

P1015 回文数

从大佬题解搬了一部分思想过来。
其实就是两步:
1.回文判断
2.转换为字符串,做高精加

#include <bits/stdc++.h>
using namespace std;
const int maxn=110;
char six[20]="0123456789ABCDEF";
bool huiwen(string str1)
{
    string str2=str1;
    reverse(str1.begin(),str1.end());
    return str1==str2;
}
string gaojingjia(int k,string str1)
{
    ///此时为k进制 两个相同位数的数做加法
    ///tip1:若是10进制,则把k改成10即可
    ///tip2:若两个位数不同
    int num1[maxn]={0},num2[maxn]={0},sum[maxn]={0};
    int len=str1.length(),len_sum=1,x=0;
    string str2=str1;
    reverse(str1.begin(),str1.end());
    for(int i=0;i<len;i++){
        if(isdigit(str1[i]))
            num1[len-i]=str1[i]-'0';//对于十六进制的特判,如果是数字减去 0,即可以变成数字
        else
            num1[len-i]=str1[i]-'A'+10;//如果不是数字减去 A 再加上 10
        if(isdigit(str2[i]))
            num2[len-i]=str2[i]-'0';
        else
            num2[len-i]=str2[i]-'A'+10;
    }
    while(len>=len_sum){//高精加的过程。其实也可以让两个数组先全加起来,然后判断每一个位子是否超了进制,超了就进1,不超就不管。
    //(另一个高精加法的办法写在以后的高精fibs里吧)
        sum[len_sum]=num1[len_sum]+num2[len_sum]+x;
        x=sum[len_sum]/k;
        sum[len_sum]%=k;
        len_sum++;
    }
    sum[len_sum]=x;
    while(sum[len_sum]==0)
        len_sum--;//将前面0全剪了
    string str;
    for(int i=len_sum;i>=1;i--)
        str+=six[sum[i]];//比较巧妙的点!!,由于不能直接输出结果,故可以定义一个字符串,对应一个const的字符串,数字是几,就变为字符让str加上。
        //而且字符串从左往右加
    return str;
}
int n;string m;
int main()
{
    cin>>n>>m;
    for(int i=0;i<=30;i++){
        if(huiwen(m)){
            printf("STEP=%d\n",i);
            return 0;//直接结束程序
        }
        else
            m=gaojingjia(n,m);
    }
    printf("Impossible!");
    return 0;
}

中间tip2,搬来写一下

    int len1=str1.length();
    int len2=str2.length();
    //前面补0,弄成长度相同
    if(len1<len2){
        for(int i=1;i<=len2-len1;i++)
           str1="0"+str1;
    }
    else{
        for(int i=1;i<=len1-len2;i++)
           str2="0"+str2;
    }
    len1=str1.length();

明天更新一下int转string的函数吧。
完结。

原创文章 9 获赞 20 访问量 434

猜你喜欢

转载自blog.csdn.net/qq_45859188/article/details/106087374