学习小结

来源:互联网 发布:聂士成 知乎 编辑:程序博客网 时间:2024/06/13 16:36

例程:

#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计算位数,终于成功。

在写代码时一定要注意数据长度和位数是我今天最大的收获。


0 0
原创粉丝点击