• “四方定理”蓝桥杯


    欢迎访问我的新博客: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)
  • 相关阅读:
    HDU1698(线段树入门题)
    POJ2528(离散化+线段树区间更新)
    POJ3630(Trie树)
    HDU1251(字典树)
    HDU1247(经典字典树)
    POJ2513(字典树+图的连通性判断)
    POJ1363
    UVa11624(逃离火焰问题)
    HDOJ1495(倒水BFS)
    poj3414Pots(倒水BFS)
  • 原文地址:https://www.cnblogs.com/milkcu/p/3808939.html
Copyright © 2020-2023  润新知