1. 程式人生 > >計算機演算法設計與分析——半數集問題

計算機演算法設計與分析——半數集問題

這裡用來解決《計算機演算法設計與分析(第四版)》第二章課後作業的“半數集問題”,話不多說,上原始碼:

執行結果是兩個txt檔案。

請大家多多指點,謝謝!

#include<stdio.h>
#include<stdlib.h>
int Hanshu(int n);
//作者:郭燎原
//時間:2018-10-21
int shuzu[1000]={0};//定義一個全域性變數
/*
int main()
{
	FILE *fp;
	int i=0;
	for(i=1;i<1000;i++)
	{
		shuzu[i]=Hanshu(i);
	}
	for(int j=1;j<1000;j++)
	{
		printf("set(%d)==%d\n",j,shuzu[j]);//這裡為什麼不用加取地址符???陣列輸出不用加取地址符!!!
	}
	if((fp=fopen("output.txt","w"))==NULL)//“w”是建立並開啟檔案
	{
		printf("Failure to open output.txt!\n");
		exit(0);
	}

	for(i=1;i<1000;i++)
	{
		fprintf(fp,"%12d",shuzu[i]);
	}
	fclose(fp);
	return 0;
}
*/

int main()
{
	FILE *fp;
	int i;
	int shuzu2[1000];
	///////////////////////這裡是建立input.txt資料夾///////////////////////////////////////
	if((fp=fopen("input.txt","w"))==NULL)//“w”是建立並開啟檔案
	{
		printf("Failure to open input.txt!\n");
		exit(0);
	}
	for(i=1;i<1000;i++)
	{
		fprintf(fp,"%4d",i);
	}
	fclose(fp);
	/////////////////////////這裡是開啟input.txt並將資料輸入陣列shuzu2中//////////////////////
	if((fp=fopen("input.txt","r"))==NULL)
	{
		printf("Failure to open input.txt!\n");
		exit(0);
	}
	/*
	for(i=1;i<1000;i++)
	{//按格式讀寫檔案
		fscanf(fp,"%4d",&shuzu2[i]);
	}*/
	for(i=1;!feof(fp);i++)
	{//按資料塊讀寫檔案
		fread(&shuzu2[i],sizeof(int),999,fp);
	}
	fclose(fp);
	

	//////////////////////////////////////////執行函式////////////////////////////////////////////////
	for(i=1;i<1000;i++)
	{
		shuzu[i]=Hanshu(shuzu2[i]);
	}
	/////////////////////////////////////將函式結果放在output.txt中////////////////////////////////////
	if((fp=fopen("output.txt","w"))==NULL)//“w”是建立並開啟檔案
	{
		printf("Failure to open output.txt!\n");
		exit(0);
	}

	for(i=1;i<1000;i++)
	{
		fprintf(fp,"%12d",shuzu[i]);
	}
	fclose(fp);
	return 0;
}

int Hanshu(int n)
{//高速演算法
	int sum=1;
	if(shuzu[n]>0)
	{
		return shuzu[n];
	}
	for(int i=1;i<=n/2;i++)
	{
		sum+=Hanshu(i);
	}

	return sum;
}

/*
int Hanshu(int n)
{//低速演算法,理論可行
	int sum=1;
	for(int i=1;i<=n/2;i++)
	{
		sum=sum+Hanshu(i);
	}
	return sum;
}
*/