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)
  • 相关阅读:
    PHP小案例
    PHP函数
    PHP基础语法
    PHP基础知识
    tp5.1前台模板的系统变量输出
    PHP常用方法很有意义的博客网址
    VS 2010(2005)Unicode使用cximage库Load函数问题
    坑爹的CFile::Remove
    固定CDockablePane的一些小技巧
    (转)理解Bitblt、StretchBlt与SetDIBitsToDevice、StretchDibits
  • 原文地址:https://www.cnblogs.com/milkcu/p/3808939.html
Copyright © 2011-2022 走看看