例程:
#include <stdio.h>
int main()
{
long int i;
int j;
int k;
long int m;
int n;
int cont = 1;
long int l = 1;
int a [ 6 ];
int b [ 6 ];
long int c [ 6 ];
for(i = 200000; i >=0 ; i--)
{
m = i;
for( cont = 0; m != 0; cont++)
m = m/10;
m = i;
for( j = 0,k = 100000; j<6 ; j++)
{
a [ j ] = m/k;b [ j ] = a [ j ];
m = m%k;
k = k/10;
}
c [ 0 ] = (a [ 0 ]*100000+a [ 1 ]*10000+a [ 2 ]*1000+a [ 3 ]*100+a [ 4 ]*10+a [ 5 ])*b [ 5 ];
c [ 1 ] = (a [ 1 ]*10000+a [ 2 ]*1000+a [ 3 ]*100+a [ 4 ]*10+a [ 5 ]*1)*(b [ 4 ]*10);
c [ 2 ] = (a [ 2 ]*1000+a [ 3 ]*100+a [ 4 ]*10+a [ 5 ]*1)*b [ 3 ]*100;
c [ 3 ] = (a [ 3 ]*100+a [ 4 ]*10+a [ 5 ]*1)*b [ 2 ]*1000;
c [ 4 ] = (a [ 4 ]*10+a [ 5 ]*1)* b [ 1 ]*10000;
c [ 5 ] = a [ 5 ]*b [ 0 ]*100000;
for( j = 0,l = 1; j<cont; j++)
l *= 10;
n = (c [ 0 ]+c [ 1 ]+c [ 2 ]+c [ 3 ]+c [ 4 ]+c [ 5 ])%l;
if(n == i)
printf("%d ",i);
}
}
此题求200000以内的自守数(一个数的平方的尾数等于该数自身的自然数)
第一次尝试时使用了求一个数的平方再求取尾数,无法求出。查看多次无效后,书上说数值过大,计算机无法显示。
将其删除,以之前高次方求尾数的方法计算,发现最后一位正确,然而其他位数仍不满足要求。
再计算多组数据后,发现最后一位是俩数最后一位乘积的个位,之前则是各位位数乘以一样位数加上之前进位。
再次编译后,结果出现乱码,反复检查后查出
m = i;
for( cont = 0; m != 0; cont++)
m = m/10;
m = i;
for( j = 0,k = 100000; j<6 ; j++)
{
a [ j ] = m/k;b [ j ] = a [ j ];
m = m%k;
k = k/10;
}
此段中第一次调用了m后并没有将其恢复为初值i,在编译后发现只有三位自守数才有效。发现只设了三位,再修改,加入一个cont计算位数,终于成功。
在写代码时一定要注意数据长度和位数是我今天最大的收获。