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");
}
总结:
总共四道题,前两道比较简单,第三道题不会使用递归算法,参考了网上的,第四题运用了嵌套循环,方法比较笨,还要重新思考