3.2趣味整数之自守数

1.问题描述
这里写图片描述
2.问题分析
这里写图片描述
3.算法设计
这里写图片描述
4.请给定数的长度
int numberOfDigit(long num){

int count=0;
while (num!=0) {
    num/=10;
    count++;
}

return count;

}

5.分离一个定数最后的几位
//分离一个定数 的最后k位
int lastNumber(long objectNumber,int k){
int count=0;
int result=0;
while (objectNumber!=0) {
int num= objectNumber%10;
objectNumber/=10;
result+= num*pow(10, count);
count++;
if (count==k) {
break;
}
}
return result;
}

5核心算法
//分析与算法设计 若采用“求出一个数的平方后再截取最后相应位数”的方法显然是不可取的,因为计算机无法表示过大的整数。
//分析手工方式下整数平方(乘法)的计算过程,以376为例
//376X376
//2256 第一个部分积=被乘数*乘数的倒数第一位
//2632 第二个部分积=被乘数*乘数的倒数第二位
//1128 第三个部分积=被乘数*乘数的倒数第三位

//核心算法,以上三部分积求和,然后分离最后三位
long sqrtnum(int num){

int length=numberOfDigit(num);
long result=0;
int count=0;
int mul=num;
while (mul!=0) {

    int s=mul%10;

    mul/=10;
    result+=num*s*pow(10, count);

    count++;
    if (count==length) {
        break;
    }

}
return result;

}

6完整程序

int numberOfDigit(long num){

int count=0;
while (num!=0) {
    num/=10;
    count++;
}

return count;

}

//分离一个定数 的最后k位
int lastNumber(long objectNumber,int k){
int count=0;
int result=0;
while (objectNumber!=0) {
int num= objectNumber%10;
objectNumber/=10;
result+= num*pow(10, count);
count++;
if (count==k) {
break;
}
}

return result;

}

//分析与算法设计 若采用“求出一个数的平方后再截取最后相应位数”的方法显然是不可取的,因为计算机无法表示过大的整数。
//分析手工方式下整数平方(乘法)的计算过程,以376为例
//376X376
//2256 第一个部分积=被乘数*乘数的倒数第一位
//2632 第二个部分积=被乘数*乘数的倒数第二位
//1128 第三个部分积=被乘数*乘数的倒数第三位

//核心算法,以上三部分积求和,然后分离最后三位
long sqrtnum(int num){

int length=numberOfDigit(num);
long result=0;
int count=0;
int mul=num;
while (mul!=0) {

    int s=mul%10;

    mul/=10;
    result+=num*s*pow(10, count);

    count++;
    if (count==length) {
        break;
    }

}
return result;

}

int main(int argc,char*argv[]){

for (long number=1; number<100000; number++) {

    int length=numberOfDigit(number);//求长度

    long sqrtNum=sqrtnum(number);//求平方
    if (lastNumber(sqrtNum, length)==number) {
        printf(" 自守数:%ld\n",number);
    }
}

return 0;

}

7运行结果
自守数:1
自守数:5
自守数:6
自守数:25
自守数:76
自守数:376
自守数:625
自守数:9376
自守数:90625

8优化拓展
这里写图片描述
9优化后完整程序框架
这里写图片描述
10完整程序
这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值