【1.1】基本算法举例(上篇)

1、竞猜商品价格

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

/*算法的作用:通过一种数学思想找到问题的解决方案*/

//看商品猜价格

void guessPrice()
{
    int oldPrice,price=0,i=0;
    printf("请设置商品的价格:");
    scanf("%d",&oldPrice);
    system("cls");
    printf("请输入试猜的价格\n");
    while(oldPrice!=price)
    {
        i++;
        printf("参与者:");
        scanf("%d",&price);
        printf("主持人:");
        if(oldPrice==price)
        {
            printf("恭喜你!答对了!\n");
            break;
        }
        else if(price>oldPrice)
        {
            printf("高了,再来一次\n");
        }
        else
        {
            printf("低了,再来一次\n");
        }
    }
    printf("您一共猜了%d次\n",i);
}

void main()
{
    guessPrice();

}



1.2菲波那切数列

#include <stdio.h>
#include <stdlib.h>
#define NUM 13

//斐波那契数列
 
void fcanobii()
{
    int i;
    long fib[NUM]={1,1};
    for(i=2;i<NUM;i++)
    {
        fib[i]=fib[i-1]+fib[i-2];
    }
    for(i=0;i<NUM;i++)
    {
        printf("%d\n",fib[i]);
    }
}

void main()
{
    fcanobii();
}


/

1.3父亲准备为小龙的四年大学生活一次性储蓄一笔钱,使用整存零取的方式,控制小龙每月月底取要存整取逆推实例: 该存多少钱?

分析:分析存钱和取钱的过程,可以采用倒推的方法。因为是按月取钱,因此需要将4年分为48个月,假设从最后只剩1000元,那么第47个月还应该有1000/(1+0.0171/12)元,依次类推,俗称逆着算。

#include <stdio.h>
#include <stdlib.h>
#define FETCH 1000
#define RATE 0.0171
int main()
{
    double corpus[49];
    int i;
    corpus[48]=(double)FETCH;
    for(i=47;i>0;i--)
    {
        corpus[i]=(corpus[i+1]+FETCH)/(1+RATE/12);
    }
    for(i=48;i>0;i--)
    {
        printf("第%d个月末本利合计为:%.2f\n",i,corpus[i]);
    }
    return 0;
}
1.4枚举算法:枚举法,又称为穷举法,是编程中常用到的一种算法。

背景:在解决某些问题的时候可能没有办法按照一定的规律去从大量的候选答案中找到正确的解,这个时候可以从候选的答案中选出可能的解一一去尝试,去进行验证。

算法要求:(1)可以预先确定候选答案 的数量

(2)候选答案的范围在求解之前必须有一个确定的集合。

算法思路:

for(i=x1;i<x2;i++)

{

    for(j=y1;j<y2;j++)

    {

        for(z=z1;z<z2;z++)

         {

            if(验证条件)

              {输出}

         }

      }

 }

穷举法举例1(填数游戏)

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int i1,i2,i3,i4,i5;
	long multi,result;
	for(i1=1;i1<=9;i1++)
	{
		for(i2=0;i2<=9;i2++)
		{
			for(i3=0;i3<=9;i3++)
			{
				for(i4=0;i4<=9;i4++)
				{
					for(i5=1;i5<=9;i5++)
					{
						multi=i1*10000+i2*1000+i3*100+i4*10+i5;
						result=i5*100000+i5*10000+i5*1000+i5*100+i5*10+i5;
						if(multi*i1==result)
						{
							printf("\n%2d%2d%2d%2d%2d\n",i1,i2,i3,i4,i5);
							printf("X%9d\n",i1);
							printf("------------------\n");
							printf("%2d%2d%2d%2d%2d\n",i5,i5,i5,i5,i5);
						}
					}
				}
			}
		}
	}
	return 0;
}
运行结果:

穷举法举例二(枚举法填运算符)

#include<stdio.h>
int main()
{
	int j,i[5];//用来表示4个运算符
	int sign;//累加运算时的符号
	int result;//保存运算式的结果
	int count=0;//计数器,统计符合条件的方案
	int num[6];//保存操作数
	float left,right;//上一步结果,下一步结果
	char oper[5]={' ','+','-','*','/'};//运算符
	printf("请输入5个数:");
	for(j=1;j<=5;j++)
		scanf("%d",&num[j]);
	printf("请输入结果:");
	scanf("%d",&result);
	for(i[1]=1;i[1]<=4;i[1]++)
		//循环四种运算,1表示+,2表示-,3表示*,4表示/
	{
		if((i[1]<4)||(num[2]!=0))//运算符若是/,则第二个运算数不能为0
		{
			for(i[2]=1;i[2]<=4;i[2]++)
			{
				if(i[2]<4||(num[3]!=0))
				{
					for(i[3]=1;i[3]<=4;i[3]++)
					{
						if((i[3]<4||num[4]!=0))
						{
							for(i[4]=1;i[4]<=4;i[4]++)
							{
								if((i[4]<4)||(num[5]!=0))
								{
									left=0;
									right=num[1];
									sign=1;
									for(j=1;j<=4;j++)
									{
										switch(oper[i[j]])
										{
										case '+':
											left=left+sign*right;
											sign=1;
											right=num[j+1];
											break;
										case '-':
											left=left+sign*right;
											sign=-1;
											right=num[j+1];
											break;
										case '*':
											right=right*num[j+1];
											break;
										case '/':
											right=right/num[j+1];
											break;
										}
									}
									if(left+sign*right==result)
									{
										count++;
										printf("%3d:",count);
										for(j=1;j<=4;j++)
											printf("%d%c",num[j],oper[i[j]]);
										printf("%d=%d\n",num[5],result);
									}
								}
							}
						}
					}
				}
			}
		}
	}
	if(count==0)
		printf("没有符合要求的方法!\n");
	return 0;
}
运行结果:



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值