试题 算法提高 四元分解 超时求优化

img

#include <iostream>
using namespace std;

int main()
{
    int cnt[1000] = { 0 };
    int n, t;
    int tmp1, tmp2, tmp3;
    for (t = 0; scanf("%d", &n) != EOF; t++)
    {
            for (int i = 0; 4 * i * i <= n; i++)
            {
                tmp1 = i * i;
                for (int j = i; tmp1 + 3 * j * j <= n; j++)
                {
                    tmp2 = tmp1 + j * j;
                    for (int k = j; tmp2 + 2 * k * k <= n; k++)
                    {
                        tmp3 = tmp2 + k * k;
                        for (int m = k; tmp3 + m * m <= n; m++)
                        {
                            if (tmp3 + m * m == n)
                            {
                                cnt[t]++;
                            }
                        }
                    }
                }
            }
    }

    for (int i = 0; i < t; i++)
    {
        printf("%d\n", cnt[i]);
    }
    return 0;
}

这是一道枚举 打表的题。我现在也不是很能理解。在控制台输入数据,并不能结束,但是居然有四个结果正确,这就很疑惑,scanf("%d", &n) != EOF 究竟意味着什么。

Ⅰ.scanf()函数语句
附:scanf()是C语言中的一个输入函数。与printf函数一样,都被声明在头文件(stdio.h)里,因此在使用scanf函数时要加上#include <stdio.h>。它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。
Ⅱ."!=“C语言中的运算符号,意为"不等于”。
Ⅲ.EOF,是一个计算机术语,全称为"End Of File",也就是文件结束符
附:在C语言在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以[字符]的[ASCII]代码值的形式存放。我们知道,[ASCII代码值]的范围是0~127,不可能出现-1,因此可以用EOF作为文件结束标志。
退出:Ctrl+Z+Enter键

希望对题主有所帮助!可以的话,帮忙点个采纳!