arrays - 修改后的 Kaprekar 数字 | 黑客等级
问题描述
修改后的 Kaprekar 数是具有d位数字的正整数n,因此,当我们将其正方形分成两部分时 - 一个具有d位数字的右手部分r和一个包含剩余d或d-1位数字的左手部分l ,碎片的总和等于原始数量(即l + r = n)。
注意: r 可能有前导零。
这是维基百科关于原始卡普雷卡数的解释(发现差异!):在数学中,给定基数的卡普雷卡数是一个非负整数,其平方在该基数中的表示可以分为两部分,加再次恢复到原来的数字。例如,45 是一个 Kaprekar 数,因为 45² = 2025 和 20+25 = 45。
任务
给定两个正整数p和q,其中p小于q。编写一个程序来确定在 和 之间的范围内有多少个 Kaprekar 数(包括两者),并将它们全部显示出来。
void kaprekarNumbers(int p, int q) {
int flag=0,cpy,i,dx,sq,d,n;
long int left,right;
while(1)
{
if(p>q)
{
if(flag==0) printf("INVALID RANGE");
exit(0);
}
else{
d=0,dx=0;;
n=p;
while(n>0){
d+=1;
n=n/10;
}
sq=p*p;
while(sq>0){
dx+=1;
sq=sq/10;
}
sq=p*p;
char str[dx];
cpy=dx-1;
while(sq>0){
str[cpy--]=(sq%10)+48;
sq=sq/10;
}
left=0,right=0;
for(i=0;i<dx-d;i++)
{
left+=(str[i]-48)*pow(10,dx-d-1-i);
}
char r[d];
int k=0;
for(i=dx-d;i<dx;i++)
{
r[k++]=str[i];
}
for(i=0;i<d;i++)
{
right+=(r[i]-48)*pow(10,d-1-i);
}
if(left+right==p)
{
printf("%d ",p);
flag=1;
}
p+=1;
}
}}
这个逻辑在 1/7 的测试用例中失败,以至于它错过了打印范围内的一些 kaprekar 数字并单独打印其余部分。如果有人更正这段代码,那将有很大帮助。TIA
解决方案
推荐阅读
- javascript - Echo PHP/JS 有问题
- image - 如何在虚拟机中使用 Jmeter 和 Docker?
- python - 具有一个共享参数的 3 个数据集的曲线拟合
- python-3.x - 正则表达式中的 unicode 字符串与字符
- php - 电子商务商店结账时的重定向
- ansible - 仅当某个服务正在运行时,如何在 ansible 中运行任务?
- c# - 将字典转换为自定义 KeyValuePair 类型列表的最佳方法是什么?
- scala - shapeless:为 HList 派生一个 Tupler
- reactjs - React useState 变量更改未反映
- react-native - 如何使用 expo-task-manager 在世博会的后台运行 setInterval