zoukankan      html  css  js  c++  java
  • “四方定理”蓝桥杯

    欢迎访问我的新博客:http://www.milkcu.com/blog/

    原文地址:http://www.milkcu.com/blog/archives/1366349160.html

    题目描述

    标题:四方定理
    数论中有著名的四方定理:所有自然数至多只要用四个数的平方和就可以表示。
    我们可以通过计算机验证其在有限范围的正确性。
    对于大数,简单的循环嵌套是不适宜的。下面的代码给出了一种分解方案。

    int f(int n, int a[], int idx)
    {
    	if(n==0) return 1;
    	if(idx==4)  return 0;
    
    	for(int i=(int)sqrt(n); i>=1; i--)
    	{
    		a[idx] = i;
    
    		if(_______________________)  return 1;  // 填空
    	}
    
    	return 0;
    }
    
    int main(int argc, char* argv[])
    {
    	for(;;)
    	{
    		int number;
    		printf("输入整数(1~10亿):");
    		scanf("%d",&number);
    		
    		int a[] = {0,0,0,0};
    
    		int r = f(number, a, 0);
    
    		printf("%d: %d %d %d %d\n", r, a[0], a[1], a[2], a[3]);
    		
    	}
    
    	return 0;
    }

    请分析代码逻辑,并推测划线处的代码。
    仅把缺少的代码作为答案,通过网页提交。
    千万不要填写多余的代码、符号或说明文字!!

    分析

    这是2013年蓝桥杯模拟题的第三题,使用了递归。

    源代码

    # include <stdio.h>
    # include <math.h>
    int f(int n, int a[], int idx)
    {
    	if(n==0) return 1;
    	if(idx==4)  return 0;
    
    	for(int i=(int)sqrt(n); i>=1; i--)
    	{
    		a[idx] = i;
    
    		if(i * i == n || f(n - i * i, a, idx + 1))  return 1;  // 填空
    	}
    
    	return 0;
    }
    
    int main(int argc, char* argv[])
    {
    	for(;;)
    	{
    		int number;
    		printf("输入整数(1~10亿):");
    		scanf("%d",&number);
    		
    		int a[] = {0,0,0,0};
    
    		int r = f(number, a, 0);
    
    		printf("%d: %d %d %d %d\n", r, a[0], a[1], a[2], a[3]);
    		
    	}
    
    	return 0;
    }

    答案

    i * i == n || f(n - i * i, a, idx + 1)
  • 相关阅读:
    poj 3348 Cows
    HDOJ4467 ( 分块 思想 )
    HDOJ 4858 项目管理 ( 只是有点 莫队的分块思想在里面而已啦 )
    luogu P1494 [国家集训队]小Z的袜子 ( 普 通 )
    CREATEINPUTLAYOUT_INCOMPATIBLEFORMAT
    load d3dcompiler_46.dll failed
    HDAO one error
    PS4 Razor GPU
    BLUR
    疑难杂症rendering(对角线上的线)
  • 原文地址:https://www.cnblogs.com/milkcu/p/3808939.html
Copyright © 2011-2022 走看看