C语言题目的问题求助!

C语言做题目的时候遇到的问题 感觉自己就是转不过来弯 如果有前辈把自己思考的过程写在下面 小弟感激不尽呀!

 #include<stdio.h>
/*
求一个整数任意次方后的最后三位数字

*/

int main()
{
    int i, x, y, z = 1;
    printf("请输入两个数,x和y(y是x的幂):\n");
    scanf("%d %d", &x, &y);
    for (i = 1; i <= y; i++)
    {
        z = z*x % 1000;
        if (z >= 100)
        {
            printf("%d%d的最后三位数是:%d", x, y, z);
        }
        else
        {
            printf("%d%d的最后三位数是:%d", x, y, z);
        }
    }

    return 0;
}
/*
算法分析:
y为x的幂 z用来保存这个整数任意次方后的最后三位数字
试数字
1234的2次方为 1 522 756
1》    x=1234 y=2
i=1 i<=2
z=z*1234%1000=234
z>100
i++=2

2》z=234*1234%1000=756

疑惑:
为什么要判断z的值是否大于或者等于100呢?
还有为什么这个数的最后三位数x这个数的结果的最后三位数 就是这个数平方积的最后三位数了 这是一个公式吗?
234 * 1234 % 1000
*/

程序有错啊,for循环应该只计算x的平方而不应该有输出,把if语句放在for的后边才对。判断z是否大于等于100,因为只有100以上才是三位数啊!else部分应该补齐两位和个位的情况。

我自己写的..又加了点东西进去

 /*
这个是我自己写的也是求任意次方的最后三位数
1.求出这个任意次方后的结果
2.判断这个数有多少位 3位数的话就输出这个数字 小于3位数就提示输出的数次方的位数小于3位数是x位数
3.大于3位数的话 就输出这个数的最后三位数
*/
#include<stdio.h>
#include<Windows.h>
int main()
{
    //求一个数字任意次方后的最后三位数字
    int n, y,i,m=1;//y为n的幂 i为循环变量 m保存次方后的结果变量
    int result;//存放结果变量
    int dight = 0;//存放位数的变量
    int m_temp;//用来求位数的时候使用
    printf("请输入n的值以及n的幂:\n");
    scanf_s("%d %d",&n,&y);

    //3 3
    for (i = 1; i <=y; i++) //1 2 
    {
        //本循环用来计算这个数次方后的结果
        m = m*n;
    }
    m_temp = m;
    //判断这个数有多少位数的for循环

    while (m_temp != 0)//m=224
    {
        m_temp= m_temp / 10;//22 |2 0 
        dight++;//1 |2 |3
    }


    if (dight < 3)
    {
        printf("本程序用来计算一个数的任何次方的末尾的三个数字,而通过计算,您输入的这个数字次方的结果小于3位数 它只有:%d位数\n", dight);
    }
    else if (dight == 3)
    {
        printf("这个数的次方结果为一个三位数,所以程序将为您输出这个数的全部部分%d\n", m);
    }

    else if (dight>3)
    {
        result = m % 1000;
        printf("%d的%d次方的结果是%d %d的最后三位数是%d", n, y, m, m, result);
    }

    system("pause");
    return 0;
}

最基本的加减乘除都还没看懂呢?自己再看看,听别人讲永远也成不了自己的。


int n, y,
printf("请输入n的值以及n的幂:\n");
scanf_s("%d %d",&n,&y);
acc = n % 1000;
for (int i = 1; i < n; i++)
{
    acc *= (n % 1000);
        acc %= 1000;
}
printf("%d的%d次方的结果的最后三位数是%d", n, y, acc % 1009);

printf("%d的%d次方的结果的最后三位数是%d", n, y, acc % 1009);
->
printf("%d的%d次方的结果的最后三位数是%d", n, y, acc % 1000);

原理,如果要算两个数相乘的最后n位数,那么只要用这两个数的最后n位数相乘取最后n位数即可。
比如,计算12*34结果的最后一位数,只要2*4,8。(12*34=408)。

◆为什么要判断z的值是否大于或者等于100呢?
☞我们可以知道z是三位数,因为计算z的公式每次都会对1000求余所以z一定小于1000,再加上z大于100,可知z在100-999之间,是三位数。

◆为什么这个数的最后三位数x这个数的结果的最后三位数 就是这个数平方积的最后三位数了 这是一个公式吗?
☞这是一个数学问题,我想不出严格的数学公理,但即便是依靠生活常识,我们也可以知道,某个运算的某一位或某几位的值受到的是原数据对应位置及之后位置的影响。比如我们知道1的100次方是1,那么我们能不能知道11的100次方最后一位是多少呢?显然,11的100次方的最后一位相当于1的100次方的最后一位,依旧是1。

■其他问题
1.代码中的判断部分要放在循环外边,目前这样写相当于计算x的平方的后三位,而非x的y次方。
2.判断部分两个分支没有任何区别,可以取消判断或修改语句展示出不同分支的不同结果。