关于算法

来源:互联网 发布:js 执行 dll 编辑:程序博客网 时间:2024/06/03 22:08
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是老二原有的加上老大的1/8            if((2520/6==lao2*6/7)&&(0==lao2%7))   //老二现在的可以整除7且给了老三后剩余的桔子数是420                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");    }


总结:
       前两道题比较简单,对于第三题,我知道是要建立一个二维表,可能性一一列举,但是却不会用递归,参考了网上的,第四题用了嵌套的循环,办法比较笨,还要继续优化改进。

原创粉丝点击