程序设计与算法(一)C语言程序设计CAP 第四周

来源:互联网 发布:java url encode 编辑:程序博客网 时间:2024/06/06 03:33

1.

所谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘3加1,如果是偶数,则除以2,得到的结果再按照上述规则重复处理,最终总能够得到1。如,假定初始整数为5,计算过程分别为16、8、4、2、1。 
程序要求输入一个整数,将经过处理得到1的过程输出来。

输入
一个正整数N(N <= 2,000,000)
输出
从输入整数到1的步骤,每一步为一行,每一部中描述计算过程。最后一行输出"End"。如果输入为1,直接输出"End"。
样例输入
5
样例输出
5*3+1=1616/2=88/2=44/2=22/2=1End
#include <iostream>#include <cstdio>using namespace std;int main(){     long long    n;   //题中的限制超过 int范围 cin >> n; while ( n != 1) {  long long  t;  if( n%2)  {   t=3*n+1;   cout << n<< "*3+1="<<  t << endl;  } else { t=n/2; cout << n <<" /2="<<  t << endl; n=t;  // 必不可少 缺少便会形成死循环  }cout << "end" << endl;    return 0;     }
注意:本题最重要的是数据类型的选区,以及循环结束后是否就行 n和t 的值交换。
2.

监护室每小时测量一次病人的血压,若收缩压在90 - 140之间并且舒张压在60 - 90之间(包含端点值)则称之为正常,现给出某病人若干次测量的血压值,计算病人保持正常血压的最长小时数。

输入
第一行为一个正整数n,n < 100其后有n行,每行2个正整数,分别为一次测量的收缩压和舒张压,中间以一个空格分隔。
输出
输出仅一行,血压连续正常的最长小时数。
样例输入
4100 8090 50120 60140 90
样例输出
2
#include <iostream>#include <cstdio>using namespace std;int main(){int n ;  //n表示输入的次数 t表示合格次数 int t=0;int low,high;cin >> n;for( int i=0 ; i<n ; i++){  cin >> high>> low;  if ( high >= 90 && high <= 140 && low <= 90 && low >= 60)      ++t;       else         t=0;     }     cout << t <<endl;     return 0; }
3.

给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2)。

输入
输入共 1 行,一个整数N。-1,000,000,000 ≤ N≤ 1,000,000,000。
输出
输出共 1 行,一个整数,表示反转后的新数。
样例输入
样例 #1:123样例 #2:-380
样例 #1:321样例 #2:-83
#include <iostream>#include <cstdio>using namespace std;int main(){int n;cin >> n;int r=0; //r表示更换后的数字while( n ){ r=r*10+(n%10); n=n/10;    }    cout << r << endl;     return 0; }
注解:该题重点是替换的想法,先进行求余运算  在进行除法运算。保证完成交换。这样交换避免了最低位为零的问题
4.

一个十进制自然数,它的七进制与九进制表示都是三位数,且七进制与九进制的三位数码表示顺序正好相反。编程求此自然数,并输出显示。

输入
无。
输出
三行:第一行是此自然数的十进制表示;第一行是此自然数的七进制表示;第一行是此自然数的九进制表示。
#include <iostream>#include <cstdio>using namespace std;int main(){for ( int i= 49 ; i < 342 ; i++){int n=i;int p1= n % 7; n=n/7;int p2=n % 7;n=n/7;int p3= n% 7 ;if ( p1*81+p2*9+p3==i){  cout << i << endl;  cout << p1 << p2 << p3 << endl;  cout << p3 << p2 << p1 << endl;  break;    }}return 0;}
注意:本题主要把握七进制三位的最小输入 100 和最大输入 342 这是题目隐藏的限制。使用for语句完成即可


5.

雇佣兵的体力最大值为M,初始体力值为0、战斗力为N、拥有X个能量元素。

当雇佣兵的体力值恰好为M时,才可以参加一个为期M天的战斗期,战斗期结束体力值将为0。在同一个战斗期内,雇佣兵每连续战斗n天,战斗力就会上升1点,n为当前战斗期开始时的战斗力。

一个战斗期结束后,雇佣兵需要用若干个能量元素使其体力恢复到最大值M,从而参加下一个战斗期。每个能量元素恢复的体力值不超过当前的战斗力。每个能量元素只能使用一次。

请问:雇佣兵的战斗力最大可以到达多少。

输入
一行包括三个整数M、N、X,相邻两个整数之间用单个空格隔开。M、N、X均为不超过10000的正整数。
输出
输出一个整数,为雇佣兵的最大战斗力。
样例输入
5 2 10
样例输出
6
#include <iostream>#include <cstdio>using namespace std;int main(){int M,N,X;cin >> M >> N >> X;while( X > 0){   int t= M/N;   N=t+N;   if( N > M)   {   cout << N <<endl;   break;   }   else    --X;}if( X =0)cout << "能量已经用完" << endl;return 0;}
注意: 要留意break 在不使用break代码的情况下 会使程序会一直循环。
方法二:
#include <iostream>#include <cstdio>using namespace std;int main(){int M,N,X;cin >> M >> N >> X;while(X > 0) {int t = M / N;if( M % N)++t;if( X < t )break;X -= t;t = M / N;N += t;}cout << N;return 0;}

6.

请统计某个给定范围[L, R]的所有整数中,数字2出现的次数。

比如给定范围[2, 22],数字2在数2中出现了1次,在数12中出现1次,在数20中出现1次,在数21中出现1次,在数22中出现2次,所以数字2在该范围内一共出现了6次。

输入
输入共 1 行,为两个正整数 L 和 R,之间用一个空格隔开。
输出
输出共 1 行,表示数字 2 出现的次数。
样例输入
样例 #1:2 22样例 #2:2 100
样例输出
样例 #1:6样例 #2:20
#include <iostream>#include <cstdio>using namespace std;int main(){int L,R;int total = 0;cin >> L >> R; for(int i = L; i <= R; ++i) {int n = i;while(n) {if( n % 10 == 2)++ total;n /= 10;}}cout << total ;return 0;}





阅读全文
0 0
原创粉丝点击