您的位置:首页 > 其它

贺利坚练习(2)

2015-09-21 14:28 423 查看
【项目1:利用循环求和】求1000以内所有偶数的和

int _tmain(int argc, _TCHAR* argv[])
{
int num;
int sum = 0;
for (num = 0; num < 1000; num++)
{
if ((num % 2) == 0)
sum += num;
else
sum = sum;
}
cout << sum << endl;
return 0;
}


【项目2:分数的累加】编程序,输出1/3-3/5+5/7-7/9…+19/21的结果

提示:关注效率,要求用单重循环完成,累加项目一正一负交替,不能用pow(-1,i)(pow()是C++中求幂的函数,但效率低)。处理一正一负交替的技巧是:专门设置一个变量s表示累加项的符号,初值为1,每次循环乘以-1,从而在+1、-1之间交替变化,再将待加项与s相乘后再相加。

int _tmain(int argc, _TCHAR* argv[])
{
float num = 0;
int s = 1;
float result = 0;

for (num = 1; num < 20; num+=2)
{
result = result + s*(num / (num + 2));
s = s*(-1);
}
cout << result << endl;
return 0;
}


【项目4:乘法口诀表】编程序,输出一个乘法口诀表,形如

提示:一共要输出9行,每一行……

int _tmain(int argc, _TCHAR* argv[])
{
int line = 0;
for (line = 1; line < 10; line++)
{
for (int j = 1; j < line + 1; j++)
{
cout << line << "X" << j << "=" << line*j << '\t';
}
cout << endl;
}
return 0;
}


项目6:穷举法解决组合问题】(自选两题完成,其他的想一想即可。当然,全做完收效更好)

先阅读例题,领会穷举法(意为“穷尽式列举”,也称枚举)的思想,然后自行选题进行解决,掌握这种程序设计的一般方法。

例题:小明有五本新书,要借给A,B,C三位小朋友,若每人每次只能借一本,则可以有多少种不同的借法?

问题分析与算法设计:本问题实际上是一个排列问题,即求从5个中取3个进行排列的方法的总数。首先对五本书从1至5进行编号,然后使用穷举的方法。假设三个人分别借这五本书中的一本,当三个人所借的书的编号都不相同时,就是满足题意的一种借阅方法。

下面是程序及其注释,要注意利用三重循环“穷举”:

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片

#include <iostream>
using namespace std;
int main()
{
int a,b,c,count=0;
cout<<"小明借书给三位小朋友书的方案有:"<<endl;
for(a=1;a<=5;a++)            //穷举a借5本书中的1本的全部情况
for(b=1;b<=5;b++)        //穷举b借5本书中的一本的全部情况
for(c=1;c<=5;c++)    //穷举c借5本书中的1本的全部情况
if(a!=b&&c!=a&&c!=b) //判断三个人借的书是否不同,(a-b)*(b-c)*(c-a)!=0更好
{
++count;
cout<<count<<": "<<a<<", "<<b<<", "<<c<<endl;//输出方案
}
return 0;
}


任务:利用穷举的方法解决下面的问题(选做一道即算完成任务,其他可以抽时间自由安排,多做会使你更聪明。)

(1)百钱百鸡问题:中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?

提示:设鸡翁、鸡母、鸡雏的个数分别为x,y,z,题意给定共100钱要买百鸡,若全买公鸡最多买20只,显然x的值在0~20之间;同理,y的取值范围在0~33之间,可得到下面的不定方程:

5x+3y+z/3=100

x+y+z=100

所以此问题可归结为求这个不定方程的整数解。

由程序设计实现不定方程的求解与手工计算不同。在分析确定方程中未知数变化范围的前提下,可通过对未知数可变范围的穷举,验证方程在什么情况下成立,从而得到相应的解。

引申:这类求解不定方程的实现,各层循环的控制变量直接与方程未知数有关,且采用对未知数的取值范围上穷举和组合的方法来复盖可能得到的全部各组解。如果要采取技巧,往往是根据题意,更合理地设置循环控制条件来减少这种穷举和组合的次数,提高程序的执行效率,需要具体问题具体分析。

int _tmain(int argc, _TCHAR* argv[])
{
int x, y, z;
int count = 0;
for (x = 0; x < 21; x++)
{
for (y = 0; y < 33; y++)
{
z = 100 - (x + y);
if ((z % 3) == 0)
{
if (((5 * x) + (3 * y) + (z / 3)) == 100)
{
count++;
cout << count << '\t' << x << '\t' << y << '\t' << z << endl;
}

}
}
}

return 0;
}


(2)换分币:用一元人民币兑换成1分、2分和5分硬币,有多少种不同的兑换方法?请输出所有可能的方案。

提示:根据题意设i,j,k分别为兑换的1分、2分、5分硬币的枚数,则i,j,k的值应满足:i+j*2+k*5=100,根据取值范围构造循环解题即可。

int _tmain(int argc, _TCHAR* argv[])
{
int x, y, z;
int count = 0;
for (x = 0; x < 101; x++)
{
for (y = 0; y < 51; y++)
{
for (z = 0; z < 21; z++)
{
if ((x + y * 2 + z * 5) == 100)
{
count++;
cout << count << '\t' << x << '\t' << y << '\t' << z << endl;
}
}
}
}

return 0;
}


(3)年龄几何:张三、李四、王五、刘六的年龄成一等差数列,他们四人的年龄相加是26,相乘是880,求以他们的年龄为前4项的等差数列的前20项。

提示:设数列的首项为n,项差为a,则前4项之和为n+(n+a)+(n+a+a)+(n+a+a+a)=4*n+6*a”,前4 项之积为n*(n+a)(n+a+a)(n+a+a+a)。同时有1<=a<=4和1<=n<=6。可采用穷举法求出此数列。

int _tmain(int argc, _TCHAR* argv[])
{
int n, a;
for (n = 1; n < 7; n++)
{
for (a = 1; a < 5; a++)
{
if ((4 * n + 6 * a == 26) && (n*(n + a)*(n + a + a)*(n + a + a + a) == 880))
{
int temp = n;
for (int i = 0; i < 20; i++)
{
cout << temp << '\t';
temp += a;
}
cout << endl;
}
}
}
return 0;
}


【项目2-Mpsziy是嘛意思?】

小明让同学传纸条给小丽,纸条上写着Mpsziy。小丽接到会心一笑,大家却不知所云。

他们俩的花招瞒不过老师,给你一个程序,输入Mpsziy,输出的,就是小明的真实意思!

老师真坏!下面,该你运行程序了,明白这样的处理方式后,扩展完成后面的两项工作:

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片

#include <cstdio>
using namespace std;
int main()
{
char ch;
while((ch=getchar())!='\n')
{
putchar(ch-4);
}
return 0;
}


(1)因为他们俩人的“加密”手段泄露,决定纸条由人传,加密数字(1-9)用两人约好的手势传。所以在解密前,需要将加密数字提前输入。例,输入4(回车)Mpsziy(回车),输出……

(2)小刚常帮着传纸条,想知道俩人的秘密,但不知道加密数字,于是悄悄写了一个程序,可以列出所有可能的情况。例,输入Mpsziy,多行输出中必然有一行是……。你就是小刚,写出这个程序来吧。

(1)

int _tmain(int argc, _TCHAR* argv[])
{
char ch;
int a;
cin >> a;
getchar();//接收之前输入a之后的回车
while ((ch = getchar()) != '\n')
{
putchar(ch - a);
}
return 0;
}


(2)

int main()
{
int n;
char ch;
cout<<"请输入加密的字符串: ";
while((ch=getchar())!='\n')
{
for(n=1;n<=9;n++)
{
putchar(ch-n);
putchar(' ');
}
cout<<endl;
}
return 0;
}


【项目3:血型统计】

黑猫警长在犯罪现场发现了一些血迹,现已经委托检验机构确定了血型,需要统计各种血型的样本数目。

输入:血型序列(A/B/O/C,C代表AB型血,输入以X结束)

输出:各种血型的数量

输入样例:ABCAOCOAOOBX

输出样例:A:3 B:2 O:4 AB:2

int _tmain(int argc, _TCHAR* argv[])
{
char blood;
int cnt1 = 0;
int cnt2 = 0;
int cnt3 = 0;
int cnt4 = 0;
while ((blood = getchar()) != 'X')
{
if (blood == 'A')
cnt1++;
if (blood == 'B')
cnt2++;
if (blood == 'O')
cnt3++;
if (blood == 'C')
cnt4++;
}
cout << "A: " << cnt1 << '\t' << "B: " << cnt2 << '\t' << "O: " << cnt3 << '\t' << "AB: " << cnt4 << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: