1.一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
#include <stdio.h>
int duck(int v)
{
if(v==7)
return 2;
return (duck(v+1)+1)*2;
}
void main()
{
int sum=duck(0);
int sell=0;
printf("出发时共赶%d只鸭子\n",sum);
for(int i=1;i<=7;i++)
{
sell=sum-duck(i);
sum=duck(i);
printf("经过第%d个村子卖出鸭子: %d\n",i,sell);
}
printf("\n");
}
2.角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。
如:输入22,
输出 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
STEP=16
#include<stdio.h>
int step=1;
int jiaogu(int a)
{
if(a==1)
{
printf("%d\n",a);
return 1;
}
else if(a%2==0)
{
step++;
printf("%d\n",a);
return jiaogu(a/2);
}
else if(a%2!=0)
{
step++;
printf("%d\n",a);
return jiaogu(a*3+1);
}
}
void main()
{
int a=0;
printf("输入一个自然数:\n");
scanf("%d",&a);
jiaogu(a);
printf("经过%d次可以的到自然数1\n",step);
}
3.电话号码对应的字符组合:在电话或者手机上,一个数字如2对应着字母ABC,7对应着PQRS。那么数字串27所对应的字符的可能组合就有3*4=12种(如AP,BR等)。现在输入一个3到11位长的电话号码,请打印出这个电话号码所对应的字符的所有可能组合和组合数。
#include <iostream>
using namespace std;
char str[10][5]= {"", "", "ABC", "DEF", "GHI", "JKL", "MNO", "PQRS", "TUV", "WXYZ"};
int size[10] = {0, 0, 3, 3, 3, 3, 3, 4, 3, 4};
int tel_length;
int number[11],answer[11];
void RecursiveSearch(int *number,int *answer,int index,int n)
{
if(index==n)
{
for(int i=0;i<n;i++)
cout<<str[number[i]][answer[i]];
cout<<endl;
return;
}
else
{
for(answer[index]=0;answer[index]<size[number[index]];answer[index]++)
{
RecursiveSearch(number,answer,index+1,n);
}
}
}
int main(int argc,const char*argv[])
{
cin>>tel_length;
for(int i=0;i<tel_length;++i)
cin>>number[i];
memset(answer,sizeof(answer),0);
RecursiveSearch(number,answer,0,tel_length);
return 0;
}
4.日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。分完 后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子?
#include<stdio.h>
void sum(int orange[],int n)
{
if(n<6)
sum(orange,n+1);
orange[n]=orange[n]/(8-n)*(9-n)-orange[n-1]/(9-n);
}//表示给出桔子前的桔子数目
void main()
{
int orange[7]={0,420,420,420,420,420,420}; //六兄弟桔子一样多,各有420个
orange[1]=orange[1]-orange[6]/2; //老大的桔子有orange[6]/2来自老二
sum(orange,1);
printf("六兄弟原来手中分别有桔子:\n");
for(int i=1;i<=6;i++)
printf("%d\n",orange[i]);
printf("\n");
}