关于算法

1.一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?

每个村庄卖去所赶鸭子的一半又一只,从后往前推,前一个村庄的鸭子数就是后一个村庄的鸭子数+1再乘以2
#include<stdio.h>
int main()
{
 int i=2;   //路过第七个村庄时的数量
 int count;
 for(int j=6;j>0;j--)
 {
  i=2*(i+1);    //路过上一个村庄时的数量
  count=i/2+1;  //卖出的鸭子
  printf("路过第%d个村庄时,有%d只鸭子,卖出了%d只鸭子\n",j,i,count);
 }
 return 0;
}

2.角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。
如:输入22,
输出 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
 STEP=15
#include<stdio.h>
int main()
{
	int i;//输入的数字
	int count=0; //计算运算次数
	scanf("%d",&i);
	do
	{
		if(i%2==0)   //如果是偶数,除以二
		{
			i=i/2;
			printf("%d ",i);
		}
		else   //如果是奇数,乘以3加1
		{
			i=i*3+1;
			printf("%d ",i);
		}
		count++;  //计数
	}while(i!=1);
	printf("\n共运算%d次\n",count);
	return 0;
}



 
3.电话号码对应的字符组合:在电话或者手机上,一个数字如2对应着字母ABC,7对应着PQRS。那么数字串27所对应的字符的可能组合就有3*4=12种(如AP,BR等)。现在输入一个3到11位长的电话号码,请打印出这个电话号码所对应的字符的所有可能组合和组合数。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char mapping[10][5] = {  //定义数组
"....",
"....",
"ABC.",
"DEF.",
"GHI.",
"JKL.",
"MNO.",
"PQRS",
"TUV.",
"WXYZ",
};
char s[16];
char t[16];
char r[16];
char c;
int i,d,L,m,j,n,k;
void main(int argc,char **argv) {
    if (argc>=2) {
        d=atoi(argv[1]);
    } else {
        scanf("%d",&d);
    }
    sprintf(s,"%d",d);
    L=strlen(s);
    k=0;
    for (i=0;i<L;i++) {
        if ('0'!=s[i]&&'1'!=s[i]) t[k++]=s[i];
    }
    t[k]=0;
    strcpy(s,t);
    L=strlen(s);
    if (0==L) return;
    m=1;
    for (i=0;i<L;i++) m=m*4;
    n=0;
    for (i=0;i<m;i++) {
        sprintf(r,"%0*s",L,ltoa(i,t,4));
        strcpy(t,r);
        for (j=0;j<L;j++) {
            r[j]=mapping[s[j]-'0'][t[j]-'0'];
        }
        k=0;
        for (j=0;j<L;j++) {
            if ('.'!=r[j]) t[k++]=r[j];
        }
        t[k]=0;
        if (L==(signed)strlen(t)) {
            printf("%d %s\n",++n,t);
        }
    }
}

4.日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。分完 后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子?
#include<math.h>
#include <iostream>
using namespace std;
void main()
    {
    int b1,b2,b3,b4,b5,b6;
    for( b1=8;b1<2520;b1=b1+8)   //老大原有的桔子数可被8整除
        {
        for(b2=1;b2<2520-b1;b2++)
            {
            int lao2=(b1/8+b2);  //lao2是原有的加老大给的
            if((2520/6==lao2*6/7)&&(0==lao2%7))   //老二的桔子数可被7整除且给老三以后剩余的桔子数是平均数
                for(b3=1;b3<2520-b1-b2;b3++)
                    {
                    int lao3=lao2/7+b3;
                    if((2520/6==lao3*5/6)&&(0==lao3%6))
                        for (b4=1;b4<2520-b1-b2-b3;b4++)
                            {
                            int lao4=lao3/6+b4;
                            if ((2520/6==lao4*4/5)&&(0==lao4%5))
                                for(b5=1;b5<2520-b1-b2-b3-b4;b5++)
                                    {
                                    int lao5=lao4/5+b5;
                                    if ((2520/6==lao5*3/4)&&(0==lao5%4))
                                        {
                                        b6=2520-b1-b2-b3-b4-b5;			
                                        int lao6=lao5/4+b6;
                                        if((2520/6==lao6*2/3) &&(0==lao6%3))
                                            if (2520/6==(b1*7/8+lao6/3))		           
                                                {
                                                cout<<"***分2520个橘子***"<<endl;
                                                cout<<"老大:"<<b1<<endl;
                                                cout<<"老二:"<<b2<<endl;
                                                cout<<"老三:"<<b3<<endl;
                                                cout<<"老四:"<<b4<<endl;
                                                cout<<"老五:"<<b5<<endl;
                                                cout<<"老六:"<<b6<<endl;
                                                cout<<"******************"<<endl;
                                                }
                                        }								
                                    }								
                            }
                    }
            }
        }
    system("pause");
    }


总结:
      总共四道题,前两道比较简单,第三道题不会使用递归算法,参考了网上的,第四题运用了嵌套循环,方法比较笨,还要重新思考



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值