这次将1009,1011,1012的题目贴出来,都是水题
1009
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用1个空格分开,输入保证句子末尾没有多余的空格。
输出格式:每个测试用例的输出占一行,输出倒序后的句子。
输入样例:Hello World Here I Come输出样例:
Come I Here World Hello
这道题目的模型就是一个栈,陷入后出,但是单位是以连续的单词而不是字符,是这道题的难点。但是可以用C++中的sstream分割,用getline函数读取整行的数据。用c++中标准的类Stack进行操作,只要进行两三个操作弹栈pop(删除栈顶元素),入栈push(加入新的栈顶元素),得到栈顶元素gettop。代码如下:
#include <iostream> #include <stack> #include <string> #include <sstream> using namespace std; int main() { stack<string> word; //以栈的形式存放所有分开来的单词 string s; stringstream ss; string a, b, c; getline(cin, s); //输入字符串 ss.clear(); ss.str(s); while(1) //将字符串分开 { ss >> a; if(ss.fail()) break; word.push(a); //将数据放入栈中 } cout << word.top() ; //访问栈顶元素,但是不删除 <span style="white-space:pre"> </span>word.pop(); //弹栈,删除栈顶元素 while(word.empty() == false) { cout << " " <<word.top() ; //访问栈顶元素,但是不删除 word.pop(); //弹栈,删除栈顶元素 } system("pause"); return 0; }
1011
给定区间[-231, 231]内的3个整数A、B和C,请判断A+B是否大于C。
输入格式:
输入第1行给出正整数T(<=10),是测试用例的个数。随后给出T组测试用例,每组占一行,顺序给出A、B和C。整数间以空格分隔。
输出格式:
对每组测试用例,在一行中输出“Case #X: true”如果A+B>C,否则输出“Case #X: false”,其中X是测试用例的编号(从1开始)。
输入样例:4 1 2 3 2 3 4 2147483647 0 2147483646 0 -2147483648 -2147483647输出样例:Case #1: false Case #2: true Case #3: true Case #4: false这题的难度不是在于计算,而是在于数据溢出,比如A和B相加或相减的值可能会溢出,那么就会影响结果,所以先进行不等式左边和右边的符号判断,若异号则能得出直接的结果;不异号,那么就改为判A是否大于C-B。但在符号判断时候,需要进行边界条件的考虑,把=0的情况考虑进去。代码如下:
#include <iostream> #include <vector> using namespace std; bool judge(long int a,long int b,long int c) //传递参数,三个长整形,若返回false表示小于等于,返回true表示大于 { if((a>0 && b<0) || (a<0 && b>0)) //在异号的时候,直接判断 { if(a + b > c) return true; else return false; } else //同号的情况下 { if(a > 0 && c < 0) //ab同号,c不同号 ab大于c return true ; else if(a < 0 && c > 0) //ab同号,c不同号 ab小于c return true ; else { if(a > (c-b)) return true; else return false; } } } int main() { int n = 0; long int a,b,c; int count = 0; cin >> count; vector <bool> T; while(n != count) { cin >> a >> b >> c ; if(judge(a,b,c)) //如果判断正确,压入true;否则压入false T.push_back(true); else T.push_back(false); n++; } for(int i=0;i<count;i++) //依次输出答案 { if(T[i]) cout << "Case #" << i+1 << ": " << "true" <<endl; else cout << "Case #" << i+1 << ": " << "false" <<endl; } system("pause"); return 0; }
1012
给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:
- A1 = 能被5整除的数字中所有偶数的和;
- A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3-n4...;
- A3 = 被5除后余2的数字的个数;
- A4 = 被5除后余3的数字的平均数,精确到小数点后1位;
- A5 = 被5除后余4的数字中最大数字。
输入格式:
每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N,随后给出N个不超过1000的待分类的正整数。数字间以空格分隔。
输出格式:
对给定的N个正整数,按题目要求计算A1~A5并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。
若其中某一类数字不存在,则在相应位置输出“N”。
输入样例1:13 1 2 3 4 5 6 7 8 9 10 20 16 18
输出样例1:30 11 2 9.7 9
输入样例2:8 1 2 4 5 6 7 9 16
输出样例2:N 11 2 N 9
这道题目,我刚开始以为只要解决C++中有效位数的输出问题即可:cout<<fixed<<setprecision(1)<< a4 ,即可输出规定的有效位数;但是还有一个问题:输入的个数的确定,我这里没有再开辟一个新的Vector去存储,因为好像题目不允许,所以每次对读进来的变量进行判断,A1-A5分别用一个去存贮结果,用count0-count4去作为每个判断的标记,判断是否存在这个数(本来我以为可以从结果去判断是否存在,但是由于数字可以有正负,所以不能直接用==0来判断是否存在这些数,这是本题需要注意的地方)代码如下:
#include <iostream> #include <iomanip> using namespace std; int main() { int result[5] = {0,0,0,0,0}; //1,2,3,5的结果 bool count4 = false; //计算最大值的计数 bool count3 = false; //计算平均数的计数 bool count2 = false; //计算平均数的计数 bool count1 = false; //计算被1整除的计数 bool count0 = false; //计算所有偶数和计数 int k = 0; //用于计数 int j = 0; float a4 = 0; //4计算浮点数的结果 int n = 0; //计算输入多少个数据 int temp = 0; //用于暂存所有数据 int i = 0; //循环变量 cin >> n; for(int i=0;i<n;i++) { cin >> temp; if(temp % 5 == 0 && temp %2 ==0) //A1能被5整除的数字中所有偶数的和 { count0 = true; //置起标志位 result[0] += temp; //累加 } else if(temp % 5 == 1) //A2,能被5整除余1,交错求和 { count1 = true ; //置起标志位 j ++ ; if(j %2 == 1) { result[1] += temp; //计数为奇数相加 } else { result[1] -= temp; //计数为偶数相减 } } else if(temp % 5 == 2) //A3被5除余2的个数 { count2 = true ; result[2] ++; } else if(temp % 5 == 3) //A4 被5整除余3的平均数 ,在外部计算 { count3 = true; k ++ ; result[3] += temp; } else if(temp % 5 == 4) //A5 被5整除余4最大的数字 { count4 = true ; if (temp >= result[4]) result[4] = temp; } } //进行所有的判断,若不存在,输出N if(count0 == true) cout << result[0] << " "; else cout << "N "; if(count1 == true) cout << result[1] << " "; else cout << "N "; if(count2 == true) cout << result[2] << " "; else cout << "N "; if(count3 == true) { a4 = (float)result[3] / k; cout<<fixed<<setprecision(1)<< a4 << " "; //输出一位有效数字 } else cout << "N "; if(count4 == true) cout << result[4] ; else cout << "N" ; system("pause"); return 0; }