C语言经典编程282例05(斐波那契数列,哥德巴赫猜想,尼科彻斯定理)

027 斐波那契数列

斐波那契(Fibonacci)数列的特点:第1个和第2个数都为1,从第3个数开始,该数是前两个数之和,求这个数列的前30个元素,
在这里插入图片描述
在数学上,斐波那契数列是以递归的方法来定义:在这里插入图片描述
将F的下标看成数组下标

#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>



  main()
{
    long  f[100];
    int i;
    f[0] = 0;
    f[1] = 1;
    f[2] = 1;
    
    for(i = 3; i <= 30; i++)		//从第3项开始,每项等于前2项之和
    {
    	f[ i ] = f[i - 1] + f[i - 2];
	}
	
	for(i = 0;i <= 30; i++)
	{
			printf("%10ld", f[i]);
			if(i % 5 == 0)			//每5个元素进行一次换行
			{
				printf("\n");
			}
	}
 } 

在这里插入图片描述

028 哥德巴赫猜想

验证100以内的正偶数都能分解为2个素数之和,即验证哥德巴赫猜想对100以内(大于2)的正偶数成立。
如:在这里插入图片描述

将一个偶数用2个素数之和表示的方法,等于同一横线上,蓝色和红色的交点数。将一个偶数用2个素数之和表示的方法,等于同一横线上,蓝色和红色的

#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>


int ss(int i)
{
	int j;
	
	if(i <= 1)			//小于1的数不是素数
	{
		return 0;
	}
	if(i == 2)			//2是素数
	{
		return 1;
	}
	
	for(j = 2; j < i; j++)		//对大于2的数进行判断,素数:除了一和他本身
	{
		if(i % j == 0)
		{
			return 0;
		}
		else if(i != j + 1)
		{
			continue;
		}
		else
		{
			return 1;
		}
	}
}

  main()
{
	int i, j, k, flag1, flag2, n = 0;
	
	for(i = 4; i < 100; i += 2)
	{
		for(k = 2; k <= i / 2; k++)
		{
			j = i - k;
			flag1 = ss(k);        		//判断拆分出的数是否是素数
			
			if(flag1)
			{
				flag2 = ss(j);
				if(flag2)				//是素数拆分
				{
					printf("%3d = %3d + %3d,", i, k, j);
					n++;
					
					if(n % 5 == 0)
					{
						printf("\n");
					}
				}
			 } 
		}
	 } 
	
     printf("\n");
 } 
  • 要将正偶数分解为2部分,再对这两部分进行判断,如果均是素数则满足题意,不是则重新判断

029 尼科彻斯定理

尼科彻斯定理: 任何一个整数的立方都可以写成一串连续奇数和,用编程验证该定理,如:输入5,运行结果:

#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>

  main()
{

	int i, j, k = 0, l, n, m, sum, flag = 1;
	
	printf("请输入一个数:\n");
	scanf("%d", &n);
	
	m = n * n * n;					//计算输入值的立方
	i = m / 2 ;						//立方值得一半
	if(i % 2 == 0)					//为偶数加一
	{
		i = i + 1;
	}
	
	while(flag == 1 && i >=1)		//当i大于等于1且flag=1时执行该语句
	{
		sum = 0;
		k = 0;
		while(1)
		{
			sum += (i - 2 * k);		//奇数累加求和
			k++;					//输出值判断
			if(sum == m)			//sum 和m相等,输出累加过程
			{
				printf("%d * %d * %d = ", n, n, n, m);
				for(l = 0; l < k-1; l++)
				{
					printf("%d + ", i - l *2);
				}
				printf("%d\n", i - (k - 1) * 2);
				flag = 0;
				break;
			 } 
			 
			 if(sum > m)			//超过退出重新计算
			 {
			 	break;
			 }
		}
		
		i -= 2;						//使初始值减小
	}
	
	
     printf("\n");
 } 
  • 先确定这串连续奇数的最大值,可以这样子分析,任何立方值(sum)的一半(x),如果是奇数,则x + x + 2 的值一定大于sum,那这串连续奇数的最大值不会超过x; 如果x是偶数,则需把它变成奇数,那么变成奇数加1,——因为x + 1 + x - 1正好等于sum,所以当x是偶数时,这串连续奇数的最大值不会超过x + 1,在确定范围后,就可以从最大值开始穷举。

参考:
哥德巴赫猜想:https://blog.csdn.net/bjweimengshu/article/details/103776026

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值