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完整程序