C言語の古典的なプログラミング282例05(フィボナッチ数列、ゴールドバッハの予想、ニコシュの定理)

027フィボナッチ数列

フィボナッチ(フィボナッチ)シーケンスの特性:最初の1と2番目の数は1、3番目の開始数、この数は最初の2つの合計であり、要素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つの部分に分解するには、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");
 } 
  • 最初に、この連続する奇数の文字列の最大値を決定します。これは、このように分析できます。任意のキューブ値(合計)は半分(x)です。奇数の場合、x + x +2の値は次のようになります。合計よりも大きい場合、この連続する奇数の文字列の最大値はxを超えません。xが偶数の場合、奇数に変換する必要があります。x+であるため、奇数に1を加えたものになります。 1 + x-1は合計に正確に等しいので、xが偶数の場合、文字列は連続します。奇数の最大値はx + 1を超えません。範囲を決定した後、最大値から徹底的に開始できます。

参照:
ゴールドバッハの予想:https://blog.csdn.net/bjweimengshu/article/details/103776026

おすすめ

転載: blog.csdn.net/qq_41070511/article/details/110287018