“四方定理”--蓝桥杯

欢迎访问我的新博客: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)
posted @ 2013-04-19 21:26  MilkCu  阅读(392)  评论(0编辑  收藏  举报