POJ 2325 Persistent Numbers#贪心+高精度除法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2325 Persistent Numbers#贪心+高精度除法相关的知识,希望对你有一定的参考价值。
这道题涉及高精度除法,模板如下:
char s[1005]; char division[1005];//存储进行高精度除法的数据 bool bignum_div(int x) { int tot=0,num=0; for(int i=0;s[i];i++) { num=num*10+s[i]-‘0‘; division[tot++]=num/x+‘0‘; num%=x; } division[tot]=‘\0‘;//利于进行strcpy() if(num==0) //有适合的除数 { int i=0; while(division[i]==‘0‘) i++; strcpy(s,division+i);//比如49->07,那么下一轮s就变成7,多余的i个0都除掉 return true; } else return false; }
题目代码:
//贪心:除数从9到2来找就可以了,因为大于9的说明不存在 //input为个位数时,特殊处理即可 /*******高精度除法 bignum_div(x)***************/ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; char s[1005]; char division[1005];//存储进行高精度除法的数据 int res[1005];//存储output数据 bool bignum_div(int x) { int tot=0,num=0; for(int i=0;s[i];i++) { num=num*10+s[i]-‘0‘; division[tot++]=num/x+‘0‘; num%=x; } division[tot]=‘\0‘;//利于进行strcpy() if(num==0) //有适合的除数 { int i=0; while(division[i]==‘0‘) i++; strcpy(s,division+i);//比如49->07,那么下一轮s就变成7,多余的i个0都除掉 return true; } else return false; } int main() { while(~scanf("%s",s)) { if(s[0]==‘-‘) break; int cnt=0; bool ok,no; no=false; int len=strlen(s); if(len<2) { printf("1%s\n",s); continue; } while(1) { ok=false; for(int i=9;i>1;i--) { if(bignum_div(i)) { ok=true; res[cnt++]=i; break; } } if(!ok) { if(strlen(s)>1)//找不到适合的除数,s又是两位数以上,如51=3x17,17为两位数,故51没有满足条件的答案 no=true; break; } } if(no) printf("There is no such number.\n"); else { for(int i=cnt-1;i>=0;i--) printf("%d",res[i]); printf("\n"); } } return 0; }
以上是关于POJ 2325 Persistent Numbers#贪心+高精度除法的主要内容,如果未能解决你的问题,请参考以下文章
算法leetcode2325. 解密消息(rust和go重拳出击)