目录
解题方法全部使用c++
1101: 求组合数
题目描述
计算从n个人中选择k个人组成一个委员会的不同组合数。显然,这个组合数是n!/(k!(n-k)!)。要求编写函数fact(),实现求一个数的阶乘功能,在主函数中调用此函数。
int fact(int n)
{
//函数返回值为n的阶乘。
}
对于C/C++代码的提交,本题要求必须通过定义fact函数和main函数实现,否则,提交编译错误,要提交完整的程序。
输入
输入两个正整数n, k,k<=n<=12。
输出
输出一个整数,即n个人中选择k个人的不同组合方案数。
样例输入
5 3
样例输出
10
源代码
#include <iostream>
using namespace std;
int fact(int n)
{
int mul = 1;
for(int i = 1;i <= n;i ++ )mul = mul * i;
return mul;
}
int main()
{
int n,k;
cin >> n >> k;
cout << (fact(n)) / ((fact(k))*(fact(n - k)));
return 0;
}
1102: 计算退票费
题目描述
12306网站火车票退票收费规定:票面乘车站开车时间前48小时以上的按票价5%计退票费。同时,车票退票费的计算方法不再四舍五入到元为单位,而是以5角为单位:尾数小于0.25元的舍去、不小于0.25元且小于0.75元的计为0.5元、不小于0.75元的进为1元。假定退票时间举例开车时间在48小时以上,请编写一个函数计算退票费。函数原型如下:
double CancelFee(double price);
本题如果是C/C++代码提交,只需要提交CancelFee函数的定义部分,提交其它内容,编译出错。
输入
输入一个实数,表示火车票票面价格。
输出
输出一个实数,表示退票费,结果保留一位小数。
样例输入
106
样例输出
5.5
源代码
#include <iostream>
#include <iomanip>
using namespace std;
double CancelFee(double price)
{
int basic = int(price * 0.05);
double flag = price * 0.05 - basic;
if(flag < 0.25)flag = 0;
else if(flag >= 0.25 && flag < 0.75)flag = 0.5;
else if(flag >= 0.75)flag = 1;
return (basic * 1.0 + flag);
}
int main()
{
int n;
cin >> n;
cout<<setiosflags(ios::fixed)<<setprecision(1)<<CancelFee(n);
return 0;
}
1103: 回文数
题目描述
一个正整数,如果从左向右读(称之为正序数)和从右向左读(称之为倒序数)是一样的,这样的数就叫回文数。输入两个整数m和n(m<n),输出区间[m,n]之间的回文数。
输入
输入两个正整数m和n,输入保证m<n。
输出
按从小到大的顺序,输出m到n之间的回文数,每个数后面有一个空格。
样例输入
100 200
样例输出
101 111 121 131 141 151 161 171 181 191
源代码
#include <iostream>
using namespace std;
int reverse(int n)
{
int ans = 0;
while(n > 0)
{
ans = ans * 10 + n % 10;
n /= 10;
}
return ans;
}
int main()
{
int m,n;
cin >> m >> n;
for(int i = m;i <= n;i ++ )
{
if(reverse(i) == i)cout<<i<<' ';
}
return 0;
}
1104: 不确定进制转换
题目描述
输入一个十进制整数n,和一个正整数k(1<k<10),将n转换为k进制数输出。
输入
一个十进制整数n,和一个正整数k(1<k<10)。
输出
n转换后的k进制数。
样例输入
-13 2
样例输出
-1101
源代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> A;
int main()
{
int n,k;
cin >> n >> k;
if(n == 0)
{
cout<<"0";
return 0;
}
else if(n < 0)
{
int num = - n;
while(num > 0)
{
int t = num % k;
A.push_back(t);
num /= k;
}
reverse(A.begin(),A.end());
cout << "-";
for(int i = 0;i < A.size();i ++ )cout<<A[i];
}
else if(n > 0)
{
int num = n;
while(num > 0)
{
int t = num % k;
A.push_back(t);
num /= k;
}
reverse(A.begin(),A.end());
for(int i = 0;i < A.size();i ++ )cout<<A[i];
}
return 0;
}
1105: 求最大数(函数的嵌套调用)
题目描述
输入三个整数a、b、c,求三个整数中的最大数。
输入
输入三个整数a、b、c。
输出
输出三个整数中的最大数。
样例输入
1 2 3
样例输出
3
源代码
#include <iostream>
using namespace std;
int main()
{
int a,b,c;
cin >> a >> b >> c;
cout << max(a,max(b,c));
return 0;
}
1106: 求n!(递归函数)
题目描述
输入一个正整数n(1<=n<=12),求n!
输入
输入一个正整数n。
输出
输出n!。
样例输入
3
样例输出
6
源代码
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int mul = 1;
for(int i = 1;i <= n;i ++ )
{
mul = mul * i;
}
cout << mul;
return 0;
}
1107: 汉诺塔
题目描述
古代有一个梵塔,塔内有3个座A,B,C。开始时A座上有n个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这n个盘子从A座移到C座,但规定每次只允许移动一个盘,并且移动过程中3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用B座。要求编程序输出移动盘子的步骤。
输入
输入一个正整数n。
输出
输出将n个盘子从A座移到C座的具体步骤。
样例输入
2
样例输出
A->B
A->C
B->C
源代码
汉诺塔这个东西非常让人头疼,当然,可以用递归函数解决,我们把汉诺塔上的n的盘子看作一个整体,递归函数hano有四个参数,n代表盘子的数目,L代表A座,M代表B座,R代表C座,把整个塔视作一个整体之后,过程仅仅分为了3部分:
第一部分:借助C座将A座盘移至B座,经过此操作之后所有盘到了B座
第二部分:借助A座将B座盘移至C座,经过此操作之后所有盘到了C座
回归部分:当n==1时,代表有一个盘在参数L座,将其移至R座即可
#include <iostream>
using namespace std;
int n;
void hano(int n,char L,char M,char R)
{
if(n == 1)
{
cout << L << "->" << R << endl;
return;
}
hano(n - 1,L,R,M);
cout << L << "->" << R << endl;
hano(n - 1,M,L,R);
}
int main()
{
cin >> n;
hano(n,'A','B','C');
return 0;
}
1108: 最大公约数
题目描述
输入两个正整数a、b,求a、b的最大公约数。要求采用递归函数实现。
输入
输入两个正整数a、b。
输出
输出a、b的最大公约数。
样例输入
20 15
样例输出
5
源代码
#include <iostream>
using namespace std;
int gcd(int a,int b)
{
int c = a % b;
if(c != 0)return gcd(b,a % b);
else return b;
}
int main()
{
int a,b;
cin >> a >> b;
cout << gcd(a,b);
return 0;
}
1109: 字符串
题目描述
由A,B,C 这3个字母就可以组成许多串,比如:"A","AB","ABC","ABA","AACBB"…。现在小明思考一个问题:输入三个正整数a、b、c,代表最多可以选择a个A,b个B,c个C 字母,能组成多少个不同的长度为n的字符串呢?
输入
输入三个正整数a、b、c、n。
输出
输出能组成多少个不同的长度为n的串
样例输入
1 1 1 2
样例输出
6
源代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 100000+10;
int a,b,c,n;
char path[N];
bool vis[N];
vector<string> A;
string s;
void dfs(int u)
{
if(u == n)
{
string t = "";
for(int i = 0;i < n;i ++ )t = t + path[i];
A.push_back(t);
return;
}
for(int i = 0;i < s.size();i ++ )
{
if(!vis[i])
{
vis[i] = 1;
path[u] = s[i];
dfs(u + 1);
vis[i] = 0;
}
}
}
int main()
{
cin >> a >> b >> c >> n;
s = "";
while(a -- )s = s + 'A';
while(b -- )s = s + 'B';
while(c -- )s = s + 'C';
dfs(0);
sort(A.begin(),A.end());
A.erase(unique(A.begin(),A.end()),A.end());
cout << A.size();
}
1110: 走台阶
题目描述
小明面前有n级台阶,如果要求同时满足两个约束条件:①每步1阶或2阶;②必须是偶数步。那么小明从0阶上到n级台阶共有多少种不同的方案数?
输入
输入一个正整数n。
输出
输出同时满足两个条件,上到n级台阶的不同方案数。
样例输入
39
样例输出
51167078
源代码
DFS会TLE,因此要找规律实现递推公式
#include <iostream>
using namespace std;
int odd(int n);//走到n阶台阶奇数解的个数
int even(int n);//走到n阶台阶偶数解的个数
//将走第一阶直到第四阶台阶的奇数解个数、偶数解个数和总解个数列一个表格,一目了然
int odd(int n)
{
if(n == 1 || n == 2)return 1;
return (even(n - 1) + even(n - 2));
}
int even(int n)
{
if(n == 1)return 0;
if(n == 2)return 1;
return (odd(n - 1) + odd(n - 2));
}
int main()
{
int n;
cin >> n;
cout << even(n);//输出走到n阶的偶数解的个数
return 0;
}
1111: 扑克牌
题目描述
小明被劫持到X赌城,被迫与其他3人玩牌。一副扑克牌(去掉大小王共52张)均匀发给4个人,每个人13张。这时小明不禁突然想:如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?
输入
无
输出
不同的初始牌型组合方案数目。
样例输入
无
样例输出
3598180
源代码
#include <iostream>
using namespace std;
int ans = 0;
void dfs(int n,int k)
{
if(n == 0)
{
ans ++ ;
return;
}
if(n > 0 && k < 13)
{
for(int i = 0;i <= 4;i ++ )
{
dfs(n - i,k + 1);
}
}
}
int main()
{
dfs(13,0);
cout << ans;
return 0;
}
1112: 第M个排列
题目描述
N个不同的一位正整数可生成N!个不同的排列(N<10),每一个排列可看成是N位整数,故可将排列按从小到大排序。请求出某给定排列后的第M个排列?
输入
包括2行,第1行有两个正整数N(N<10)和M,以空格分隔;第2行是这N个整数的一个排列,用空格隔开。
输出
只有1行,代表输入排列后第M个排列。
样例输入
5 3
1 2 3 4 5
样例输出
1 2 4 5 3
源代码
#include <iostream>
using namespace std;
int ans = 0;
const int N = 1000000+10;
int path[N];
int a[N];
int n,m;
bool vis[N];
void dfs(int u)
{
if(u == n)
{
ans ++ ;
if(ans == m + 1)
{
for(int i = 0;i < n;i ++ )cout << path[i] << ' ';
cout<<endl;
}
return;
}
for(int i = 1;i <= n;i ++ )
{
if(!vis[a[i]])
{
path[u] = a[i];
vis[i] = 1;
dfs(u + 1);
vis[i] = 0;
}
}
}
int main()
{
cin >> n >> m;
for(int i = 1;i <= n;i ++ )cin >> a[i];
dfs(0);
return 0;
}
1113: 按字典序输出所有排列
题目描述
从n个不同元素任取m(m<=n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。现输入n个递增的数,请你输出这n个数中取出m个元素的所有排列,并将所有排列按字典序输出。
输入
输入为两行,第一行为两个整数n, m,以空格分隔(1<=n<=9, k<n);第二行为以空格分隔的n个整数xi(1<=xi<=9)。
输出
每一种排列占一行,各元素间用逗号隔开。
样例输入
3 2
1 2 3
样例输出
1,2
1,3
2,1
2,3
3,1
3,2
源代码
#include <iostream>
using namespace std;
int ans = 0;
const int N = 1000000+10;
int path[N];
int a[N];
int n,m;
bool vis[N];
void dfs(int u)
{
if(u == m)
{
for(int i = 0;i < u;i ++ )
{
if(i == 0)cout << path[i];
else cout << ',' <<path[i];
}
cout<<endl;
return;
}
for(int i = 1;i <= n;i ++ )
{
if(!vis[a[i]])
{
path[u] = a[i];
vis[i] = 1;
dfs(u + 1);
vis[i] = 0;
}
}
}
int main()
{
cin >> n >> m;
for(int i = 1;i <= n;i ++ )cin >> a[i];
dfs(0);
return 0;
}
1114: 选数
题目描述
已知n个整数x1,x2,⋯,xn,以及一个整数k(k<n)。从n个整数中任选k个整数相加,可分别得到一系列的和。例如当 n=4,k=3,4个整数分别为3,7,12,19时,可得全部的组合及其和为:3+7+12=22;3+7+19=29;7+12+19=38;3+12+19=34。请你计算出和为素数的组合共有多少种。本例中只有一种组合的和为素数:3+7+19=29。
输入
输入为两行,第一行为两个整数n, k,以空格分隔(1≤n≤20, k<n);第二行为以空格分隔的n个整数xi(1≤xi≤5000000)。
输出
一个整数(满足条件的种数)。
样例输入
4 3
3 7 12 19
样例输出
1
源代码
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
const int N = 1000000+10;
int a[N];
int path[N];
bool vis[N];
int n,k;
vector<int> A;
bool judge(int n)
{
if(n == 1)return false;
for(int i = 2;i <= sqrt(n);i ++ )
{
if(n % i == 0)return false;
}
return true;
}
void dfs(int u)
{
if(u == k)
{
int sum = 0;
for(int i = 0;i < k;i ++ )sum += path[i];
if(judge(sum))A.push_back(sum);
return;
}
for(int i = 1;i <= n;i ++ )
{
if(!vis[i])
{
vis[i] = 1;
path[u] = a[i];
dfs(u + 1);
vis[i] = 0;
}
}
}
int main()
{
cin >> n >> k;
for(int i = 1;i <= n;i ++ )cin >> a[i];
dfs(0);
sort(A.begin(),A.end());
A.erase(unique(A.begin(),A.end()),A.end());
cout << A.size();
return 0;
}
1115: 本年度第几天(函数实现)
题目描述
输入多个测试用例,每个测试用例为一日期,输出该日期是所在年的第几天。
输入
输入多个测试用例,每个测试用例为一日期,每个测试用例占一行。
输出
对每个测试用例输出该日期是所在年的第几天,每个输出占一行。
样例输入
2021 1 29
样例输出
29
源代码
#include <iostream>
using namespace std;
int a[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int b[13] = {0,31,29,31,30,31,30,31,31,30,31,30,31};
int getdate(int year,int month,int day)
{
int ans = 0;
if((year % 4 == 0 && year % 100 != 0)||(year % 400 == 0))
{
for(int i = 1;i < month;i ++ )ans += b[i];
ans += day;
}
else
{
for(int i = 1;i < month;i ++ )ans += a[i];
ans += day;
}
return ans;
}
int main()
{
int year,month,day;
cin >> year >> month >> day;
cout << getdate(year,month,day);
return 0;
}
1116: 身份证号检验
题目描述
二代身份证由18位组成,最后一位为校验仪。其计算方法是:前17位分别乘以权重Wi(从左边开始数各位的Wi分别为{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1}),乘积之和除11得余数,再将余数0-10分别转换为{1,0,X,9,8,7,6,5,4,3,2}(即0转换为1,1转换为0,2转换为X,3转换为9……),即为校验位的值。编写程序,输入一个身份证号,计算其检验位的值,与最后一位比较验证其是否正确,若正确输出出生日期,错误则输出“Fail”。
输入
一个身份证号。
输出
若身份证号正确则输出出生日期,错误则输出“Fail”。
样例输入
410108201410310102
样例输出
20141031
源代码
#include <iostream>
using namespace std;
int a[19] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1};
char b[12] = {'1','0','X','9','8','7','6','5','4','3','2'};
int main()
{
string s;
getline(cin,s);
int sum = 0;
for(int i = 0;i < 17;i ++ )
{
sum += a[i] * (s[i] - '0');
}
int r = sum % 11;
if(b[r] == s[17])
{
for(int i = 6;i < 14;i ++ )cout << s[i];
}
else cout << "Fail";
return 0;
}
1117: 分隔字符串
题目描述
编写toArray函数,其函数原型为int toArray(char *str, char c, int arr[]);将字符串str用c所指定的分隔符分割并转换为整型数后填入整型数组arr,函数值为该数组元素个数。例如将“512,34,288”用’,’分割的结果是:整型数组中包含512,34,288三个元素。编写测试程序,输入字符串,调用toArray函数,打印输出该字符串及转换结果。
输入
12,34,567
输出
12 34 567
样例输入
12,34,567
样例输出
12 34 567
源代码
#include <iostream>
#define gets(S) fgets(S,sizeof(S),stdin)
#include <cstring>
using namespace std;
const int N = 1000000+10;
char a[N];
int arr[N];
int idx = 0;
int toArray(string s, char c, int arr[])
{
if(s[s.size() - 1] >= '0' && s[s.size() - 1] <= '9')s = s + ' ';
int num = 0;
for(int i = 0;i < s.size();i ++ )
{
if(s[i] >= '0' && s[i] <= '9')
{
num = num * 10 + (s[i] - '0');
}
else
{
arr[idx++] = num;
num = 0;
}
}
for(int i = 0;i < idx;i ++ )cout << arr[i] << c;
return idx;
}
int main()
{
string s;
getline(cin,s);
toArray(s,' ',arr);
return 0;
}
1118: 十六进制转换为十进制
题目描述
编写一解码程序Hex2Dec把4位16进制字符串转换为整型数,如“FFF8”=-8。
输入
一个4位16进制字符串。
输出
与字符串对应的十进制整数。
样例输入
FFF8
样例输出
-8
源代码
按照平常学的十六进制转十进制来做的话FFF8应该为65528,但是其实际输出为-8。65528的运算时十六进制转十进制是按照4字节运算,而-8的运算则是按照2字节的进行运算,这些东西是大二计算机组成原理要学到的内容。因为我也不太懂,所以用程序员计算器稍微实践了一下,并发现对于四位数的十六进制转十进制的2字节的运算,首位既为数值位又为符号位,因此只要首位是大于7的数组则表示其实际转换之后的值是负数,而十六进制在进行4字节的运算的时候最大值不超过65535,由此也就能实现负数的转换,当四位十六进制数的首位符合负数的条件之后,按照4字节的方式转换并减去65536即为所求答案,当其首位不满足负数条件时,直接转化的结果即为正确答案
#include <iostream>
using namespace std;
int Hex2Dec(string s)
{
int flag = 1;
if((s[0] >= '8' && s[0] <= '9')||(s[0] >= 'A' && s[0] <= 'F'))flag = 0;
int ans = 0,w = 1;
for(int i = s.size() - 1;i >= 0;i -- )
{
if(s[i] >= '0' && s[i] <= '9')
{
ans = ans + (s[i] - '0') * w;
}
else ans = ans + (s[i] - 'A' + 10) * w;
w = w * 16;
}
if(flag == 1)return ans;
else return ans - 65536 ;
}
int main()
{
string s;
getline(cin,s);
int ans = Hex2Dec(s);
cout << ans;
return 0;
}
1119: 求组合数(递归)
题目描述
计算从n个人中选择k个人组成一个委员会的不同组合数。
输入
两个正整数n、k。
输出
n个人中选择k个人的不同组合数。
样例输入
10 1
样例输出
10
源代码
C(n,m)=C(n-1,m)+C(n-1,m-1)
#include <iostream>
using namespace std;
int C(int n,int k)
{
if(n <= 0 && k > n)return 0;
else if(n == k || k == 0)return 1;
return C(n - 1,k) + C(n - 1,k - 1);
}
int main()
{
int n,k;
cin >> n >> k;
cout << C(n,k);
return 0;
}
1120: 素数的排位
题目描述
小明在研究素数,已知素数序列为2、3、5、7、……,即第一个素数是2,第二个是3,……。他为搞清一些素数究竟在素数集合中排名老几,伤透了脑筋。还是请你帮他编个程序搞定吧,否则,他慢腾腾慢腾腾地数,数到什么时候去?
输入
输入有正整数N(1≤N≤1000000)若干。
输出
运行结果每个数占1行,结果中的每个数是输入的正整数在素数集合中的排位。如果输入的不是素数(这太有可能了),那就输出一个0表示。
样例输入
2
6
4
5
13
样例输出
1
0
0
3
6
源代码
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
const int N = 1000000+10;
int a[N];
bool judge(int n)
{
if(n == 1)return false;
for(int i = 2;i <= sqrt(n);i ++ )
{
if(n % i == 0)return false;
}
return true;
}
int main()
{
int n;
while(cin >> n)
{
vector<int> A;
if(judge(n))
{
for(int i = 2;i <= n;i ++ )
{
if(judge(i))A.push_back(i);
}
cout<<A.size()<<endl;
}
else cout<<'0'<<endl;
}
return 0;
}
1121: 母牛问题
题目描述
假设单性繁殖成立,若一头母牛,从出生起第四个年头开始,每年生一头母牛,而生出的小母牛在之后的第四年也将具有生殖能力。按此规律,第n年时有多少头母牛?
输入
测试数据有多组,每组测试输入一个正整数n(1≤n≤40)。
输出
对于每个n,输出其第n年的母牛数,每个结果对应一行输出。
样例输入
5
6
7
8
9
样例输出
3
4
6
9
13
源代码
#include <iostream>
using namespace std;
int f(int n)
{
if(n == 1 || n == 2 || n == 3)return 1;
return f(n - 1) + f(n - 3);
}
int main()
{
int n;
while(cin >> n)cout << f(n) << endl;
return 0;
}
1122: 特殊排序
题目描述
输入一个正整数n和n个各不相等的整数(1<n<100),将这些整数从小到大进行排序,要求奇数在前,偶数在后。
输入
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试先输入一个整数n(1<n<100),再输入n个整数。
输出
对于每组测试数据,输出根据要求排序后的结果,数据之间保留一个空格。
样例输入
3
5 1 2 3 4 5
3 12 4 5
6 2 4 6 8 0 1
样例输出
1 3 5 2 4
5 4 12
1 0 2 4 6 8
源代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int t;
cin >> t;
while(t -- )
{
vector<int> A,B;
int n;
cin >> n;
while(n -- )
{
int num;
cin >> num;
if(num % 2 == 1)A.push_back(num);
else B.push_back(num);
}
sort(A.begin(),A.end());
sort(B.begin(),B.end());
for(int i = 0;i < A.size();i ++ )cout << A[i] << ' ';
for(int i = 0;i < B.size();i ++ )cout << B[i] << ' ';
cout << endl;
}
return 0;
}
1123: 不当老大
题目描述
“当老大有什么意思!”小明如是想。于是他把班级里的同学按年龄排序,最为推崇第二大的同学了!然而,他也很推崇倒数第二大的同学。请问这两个同学相差多少岁?
输入
第一行是数据的组数 nCase (n<=5),每组测试数据的第一行是一个整数 n(n>=2) ,表示班级里有 n 位同学。以下是 n 位同学的年龄。
输出
年龄第二和倒数第二的同学的年龄差。
样例输入
2
50
16 19 4 25 20 5 28 28 30 26 13 18 2 14 1 30 14 2 3 17 6 6 24 16 16 30 2 29 16 27 9 29 24 7 14 5 7 6 13 1 21 1 18 8 5 6 2 7 14 7
20
9 29 24 7 14 5 7 6 13 1 21 1 18 8 5 6 2 7 14 7
样例输出
29
23
源代码
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1000000+10;
int a[N];
void quick_sort(int a[],int l,int r)
{
if(l >= r)return;
int x = a[l + r >> 1],i = l - 1,j = r + 1;
while(i < j)
{
do i ++ ;while(a[i] < x);
do j -- ;while(a[j] > x);
if(i < j)swap(a[i],a[j]);
}
quick_sort(a,l,j);
quick_sort(a,j + 1,r);
}
int main()
{
int t;
cin >> t;
while(t -- )
{
memset(a,0,sizeof(a));
int n;
cin >> n;
for(int i = 1;i <= n;i ++ )cin >> a[i];
quick_sort(a,1,n);
cout << abs(a[n - 1] - a[2]) << endl;
}
return 0;
}
1124: 平方和排序
题目描述
输入int 类型范围内的N个非负整数,要求按照各个整数的各数位上数字的平方和从小到大排序,若平方和相等,则按照数值从小到大排序。例如,三个整数9、31、13,各数位上数字的平方和分别为81、10、10,则排序结果为13、31、9。
输入
测试数据有多组。每组数据先输入一个整数N(0<N<100),然后输入N个非负整数,若N=0,则输入结束。
输出
对于每组测试,在一行上输出按要求排序后的结果,数据之间留一个空格。
样例输入
9
12 567 91 33 657 812 2221 3 77
5
1 3 11 33 9
0
样例输出
12 3 2221 33 812 91 77 567 657
1 11 3 33 9
源代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Point
{
int a;
int b;
};
vector<Point> A;
int deal(int n)
{
int sum = 0;
while(n > 0)
{
int num = n % 10;
sum += num * num;
n /= 10;
}
return sum;
}
int cmp(const struct Point & A,const struct Point &B)
{
if(A.b!=B.b)return A.b < B.b;
else return A.a < B.a;
}
int main()
{
int n;
while(cin >> n,n != 0)
{
A.clear();
for(int i = 1;i <= n;i ++ )
{
int num;
cin >> num;
int flag = deal(num);
A.push_back({num,flag});
}
sort(A.begin(),A.end(),cmp);
for(int i = 0;i < A.size();i ++ )
{
cout << A[i].a << ' ';
}
cout << endl;
}
}
1125: 按长度排序
题目描述
先输入一个正整数N,再输入N个整数,要求对N个整数进行排序,先按长度从小到大排序,若长度相同,则按数值从小到大排序。
输入
多组测试数据,每组数据的第一行输入一个整数N(0<N<100),第二行输入N个整数(每个整数最多可达80位)。若N=0,则输入结束。
输出
对于每组数据,输出排序后的结果,每个数据占一行。每两组测试结果之间留一个空行。
样例输入
3
123
12
3333
2
1000000000000000
1
0
样例输出
12
123
3333
1
1000000000000000
源代码
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<string> A;
int main()
{
int n;
while(cin >> n,n != 0)
{
A.clear();
getchar();
for(int i = 1;i <= n;i ++ )
{
string s;
getline(cin,s);
A.push_back(s);
}
sort(A.begin(),A.end());
for(int i = 0;i < A.size();i ++ )cout << A[i] << endl;
cout<<endl;
}
}
1126: 按日期排序
题目描述
输入若干日期,按日期从小到大排序。
输入
本题只有一组测试数据,且日期总数不超过100个。按“MM/DD/YYYY”(月/日/年,其中,月、日各2位,年4位)的格式逐行输入若干日期。
输出
按“MM/DD/YYYY”的格式输出已经从小到大排序的各个日期,每个日期占一行。
样例输入
12/31/2005
10/21/2003
02/12/2004
12/12/1999
10/22/2003
11/30/2005
样例输出
12/12/1999
10/21/2003
10/22/2003
02/12/2004
11/30/2005
12/31/2005
源代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Date
{
int year;
int month;
int day;
};
vector<Date> A;
int cmp(const struct Date &A,const struct Date &B)
{
if(A.year != B.year)return A.year < B.year;
else if(A.month != B.month)return A.month < B.month;
else if(A.day != B.day)return A.day < B.day;
}
int main()
{
int year,month,day;
while(~scanf("%2d%*c%2d%*c%4d",&month,&day,&year))
{
A.push_back({year,month,day});
}
sort(A.begin(),A.end(),cmp);
for(int i = 0;i < A.size();i ++ )
{
printf("%02d/%02d/%04d\n",A[i].month,A[i].day,A[i].year);
}
return 0;
}
1127: Rightmost Digit(最后一位数字)
题目描述
Given a positive integer N, you should output the most right digit of N^N.
输入
The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow.
Each test case contains a single positive integer N(1<=N<=1,000,000,000).
输出
For each test case, you should output the rightmost digit of N^N.
样例输入
2
3
4
样例输出
7
6
源代码
#include <iostream>
using namespace std;
typedef long long ll;
ll fast(ll a,ll b,ll p)
{
if(b == 0)return 1%p;
ll mul = 1;
while(b > 0)
{
if(b & 1)
{
mul = mul * a % p;
}
b >>= 1;
a = (a * a) % p;
}
return mul;
}
int main()
{
int t;
cin >> t;
while(t -- )
{
ll n;
cin >> n;
ll ans = fast(n,n,10);
cout << ans << endl;
}
return 0;
}
1128: 多个数的最小公倍数
题目描述
输入n个数,请计算它们的最小公倍数。如5、7、15的最小公倍数是105。
输入
首先输入一个正整数T,表示测试数据的组数,然后是T组的测试数据。
每组测试先输入一个整数n(2<=n<=20),再输入n个正整数(n属于[1,100000]),这里保证最终的结果在int型范围内。
输出
对于每组测试,输出n个整数的最小公倍数。
样例输入
2
3 5 7 15
5 1 2 4 3 5
样例输出
105
60
源代码
#include <iostream>
using namespace std;
const int N = 100000+10;
int a[N];
int gcd(int a,int b)
{
int c = a % b;
if(c == 0)return b;
return gcd(b,a % b);
}
int lcd(int a,int b)
{
int c = a * b;
return (c) / (gcd(a,b));
}
int main()
{
int t;
cin >> t;
while(t -- )
{
int n;
cin >> n;
for(int i = 1;i <= n;i ++ )cin >> a[i];
int ans = a[1];
for(int i = 2;i <= n;i ++ )ans = lcd(ans,a[i]);
cout<<ans<<endl;
}
return 0;
}
1129: 大整数加法
题目描述
小明经常会碰到超大整数的加法运算,而普通的计算器上无法进行。因此他想请你帮他写一个程序来计算结果。
输入
输入数据有多组。首先输入一个整数T,表示有T组输入。
每组输入两个大整数,并用空格隔开。每个整数最多1000位。没有负数输入。
输出
对于每组输入,输出两个整数的和,单独占一行。
样例输入
2
1 2
112233445566778899 998877665544332211
样例输出
3
1111111111111111110
源代码
#include <iostream>
#include <vector>
using namespace std;
vector<int> add(vector<int> &A,vector<int> &B)
{
vector<int> C;
int t = 0;
for(int i = 0;i < A.size()||i < B.size();i ++ )
{
if(i < A.size())t += A[i];
if(i < B.size())t += B[i];
C.push_back(t % 10);
t /= 10;
}
if(t)C.push_back(1);
return C;
}
int main()
{
int t;
cin >> t;
while(t -- )
{
vector<int> A,B;
string a,b;
cin >> a >> b;
for(int i = a.size() - 1;i >= 0;i -- )A.push_back(a[i] - '0');
for(int i = b.size() - 1;i >= 0;i -- )B.push_back(b[i] - '0');
auto C = add(A,B);
for(int i = C.size() - 1;i >= 0;i -- )cout << C[i];
cout << endl;
}
return 0;
}
1130: 排序3个整数(指针实现)
题目描述
用指针方法编写一个程序,输入3个整数,将它们按由小到大的顺序输出。
输入
输入以空格分隔的3个整数
输出
将三个整数按从小到大顺序输出。
样例输入
3 2 1
样例输出
1 2 3
源代码
#include <iostream>
using namespace std;
void swap(int *a,int *b)
{
int t;
t = *a;
*a = *b;
*b = t;
}
int main()
{
int a,b,c;
cin >> a >> b >> c;
int *A = &a;
int *B = &b;
int *C = &c;
if(a > b)swap(A,B);
if(a > c)swap(A,C);
if(b > c)swap(B,C);
cout << a << ' ' << b << ' ' << c;
return 0;
}
1131: 交换两个数组对应元素
题目描述
编写一个使用指针的函数,交换数组a和数组b中的对应元素
输入
输入包括三行,第一行为一个正整数n,第二行为数组a的n个元素(以空格分隔),第三行为数组b的n个元素(以空格分隔)。
输出
将数组a和数组b中对应的n个元素交换后,输出两行,第一行为数组a的n个元素(以空格分隔),第二行为数组b的n个元素(以空格分隔)。
样例输入
5
1 2 3 4 5
6 7 8 9 10
样例输出
6 7 8 9 10
1 2 3 4 5
源代码
#include <iostream>
using namespace std;
const int N = 1000000+10;
int a[N],b[N];
void swap(int *a,int *b)
{
int t;
t = *a;
*a = *b;
*b = t;
}
int main()
{
int n;
cin >> n;
for(int i = 1;i <= n;i ++ )cin >> a[i];
for(int i = 1;i <= n;i ++ )cin >> b[i];
for(int i = 1;i <= n;i ++ )
{
int *p1 = &a[i];
int *p2 = &b[i];
swap(p1,p2);
}
for(int i = 1;i <= n;i ++ )cout << a[i] << ' ';
cout << endl;
for(int i = 1;i <= n;i ++ )cout << b[i] << ' ';
return 0;
}
1132: 字符统计
题目描述
编写一个使用指针的程序,输入一个字符串,找出其中的大写字母,小写字母,空格,数字,及其他字符的个数。
输入
输入一个字符串。
输出
输出该字符串中大写字母,小写字母,空格,数字,及其他字符的个数。
样例输入
Abc 1234,.,-+
样例输出
1 2 3 4 5
源代码
#include <iostream>
using namespace std;
int main()
{
string s;
getline(cin,s);
int a = 0,b = 0,c = 0,d = 0,e = 0;
for(int i = 0;i < s.size();i ++ )
{
if(s[i] >= 'A' && s[i] <= 'Z')a ++ ;
else if(s[i] >= 'a' && s[i] <= 'z')b ++ ;
else if(s[i] == ' ')c ++ ;
else if(s[i] >= '0' && s[i] <= '9')d ++ ;
else e ++ ;
}
cout << a << ' ' << b << ' ' << c << ' ' << d << ' ' << e;
return 0;
}
1133: 数组元素逆置
题目描述
编写一个使用指针的函数,实现数组元素的逆置。
输入
输入两行,第一行为一个正整数n,第二行为a数据的n个元素,以空格分隔。
输出
将a数据元素逆置后输出,元素间以空格分隔。
样例输入
5 5 4 3 2 1
样例输出
1 2 3 4 5
源代码
#include <iostream>
using namespace std;
const int N = 1000000+10;
int a[N];
void swap(int *a,int *b)
{
int t;
t = *a;
*a = *b;
*b = t;
}
int main()
{
int n;
cin >> n;
for(int i = 1;i <= n;i ++ )cin >> a[i];
for(int i = 1,j = n;i < j;i ++ ,j -- )
{
int *p1 = &a[i];
int *p2 = &a[j];
swap(p1,p2);
}
for(int i = 1;i <= n;i ++ )cout << a[i] << ' ';
return 0;
}
1134: 字符串比较
题目描述
编写函数实现两个字符串的比较。即自己写一个strcmp函数,函数原型为:
int strcmp(char *p1, char *p2)
设置p1指向字符串s1,p2指向字符串s2。要求:当s1=s2时返回值为0;当s1不等于s2时返回它们两者的第一个不同字符的ASCII码差值(如”boy”与”bad”,第二个字母不同,’a’与’a’之差为79-65=14);如果s1>s2则输出正值,如果s1<s2则输出负值。
输入
输入两行,每行一个字符串。
输出
两个字符串第一个不同字符的ASCII码差值。
样例输入
boy
bad
样例输出
14
源代码
#include <iostream>
#include <cstring>
#define gets(S) fgets(S,sizeof(S),stdin)
using namespace std;
const int N = 100000+10;
char a[N],b[N];
int strcmp(char *p1,char *p2)
{
for(int i = 0;i < strlen(p1) || i < strlen(p2);i ++ )
{
if(p1[i] != p2[i])
{
return (p1[i] - 'a') - (p2[i] - 'a');
break;
}
}
return 0;
}
int main()
{
gets(a);
gets(b);
char *p1 = &a[0];
char *p2 = &b[0];
cout << strcmp(p1,p2);
return 0;
}
1135: 字符串插入
题目描述
设计函数void insert(char* s1, char* s2, char* s, int n),用指针实现在字符串s1中的指定位置n处插入字符串s2。
输入
输入包括三行,前两行分别为字符串s1和s2,第三行为一非负整数n。
输出
在s1的指定位置n处插入s2生成的字符串。
样例输入
abc
def
0
样例输出
defabc
源代码
#include <iostream>
#include <cstring>
#define gets(S) fgets(S,sizeof(S),stdin)
using namespace std;
const int N = 100000+10;
char a[N],b[N],c[N];
int n,idx = 0;
void insert(char *p1,char *p2,char *s,int n)
{
for(int i = 0;i < strlen(p1) - 1;i ++ )
{
if(i == n)
{
for(int j = 0;j < strlen(p2) - 1;j ++ )
{
s[idx ++ ] = p2[j];
}
}
s[idx ++ ] = p1[i];
}
}
int main()
{
gets(a);
gets(b);
char *p1 = &a[0];
char *p2 = &b[0];
char *s = &c[0];
cin >> n;
getchar();
insert(p1,p2,s,n);
for(int i = 0;i < strlen(c);i ++ )cout << c[i];
return 0;
}
1136: 字符串复制
题目描述
利用指针完成字符串复制函数void strcpy(char* s1, char* s2)。
输入
输入包括两行,分别为字符串s1和s2
输出
将s1赋值为s2后,分别输出s1和s2。
样例输入
world cup!
good luck!
样例输出
world cup!
world cup!
源代码
#include <iostream>
#include <cstring>
#define gets(S) fgets(S,sizeof(S),stdin)
using namespace std;
const int N = 100000+10;
char a[N],b[N];
void strcpy(char *p1,char *p2)
{
memset(p2,0,sizeof(p2));
for(int i = 0;i < strlen(p1);i ++ )p2[i] = p1[i];
}
int main()
{
gets(a);
gets(b);
char *p1 = &a[0];
char *p2 = &b[0];
strcpy(p1,p2);
for(int i = 0;i < strlen(a) - 1;i ++ )cout << a[i];
cout << endl;
for(int i = 0;i < strlen(b) - 1;i ++ )cout << b[i];
return 0;
}
1137: 词组缩写
题目描述
定义:一个词组中每个单词的首字母的大写组合称为该词组的缩写。 比如,C语言里常用的EOF就是end of file的缩写。
输入
输入的第一行是一个整数T,表示一共有T组测试数据; 接下来有T行,每组测试数据占一行,每行有一个词组,每个词组由一个或多个单词组成;每组的单词个数不超过10个,每个单词有一个或多个大写或小写字母组成; 单词长度不超过10,由一个或多个空格分隔这些单词。
输出
请为每组测试数据输出规定的缩写,每组输出占一行。
样例输入
1
end of file
样例输出
EOF
源代码
#include <iostream>
using namespace std;
int main()
{
int T;
cin >> T;
getchar();
while(T -- )
{
string s;
getline(cin,s);
if(s[0] != ' ')s = ' ' + s;
if(s[s.size() - 1] != ' ')s = s + ' ';
for(int i = 0;i < s.size();i ++ )
{
if((s[i - 1] == ' '&&s[i + 1] != ' ')||((s[i - 1] == ' '&&s[i + 1] == ' ')))
{
if(s[i] >= 'a' && s[i] <= 'z')
{
cout << char(s[i] - 32);
}
else if(s[i] >= 'A' && s[i] <= 'Z')
{
cout << s[i];
}
}
}
cout<<endl;
}
}
1138: 月末账单统计
题目描述
每到月末,小明就会统计本月支出账单,请编程帮助他完成任务。
输入
第一行是整数n (n<100)。然后是n行的账单信息,每一行由事物的名字name和对应的花费c组成,长度不超过200。中间会有一个或多个空格,而每一行的开头和结尾没有空格。 0.0 < c < 1000.0。
输出
输出总的花费,小数点后保留一位数字。
样例输入
3
Apple 2.3
Buy clothes for girl friends 260.5
Go to cinema 30
样例输出
292.8
源代码
#include <iostream>
#include <cstring>
#define gets(S) fgets(S,sizeof(S),stdin)//避免编译错误
#include <iomanip>
using namespace std;
int main()
{
int n;
cin >> n;
getchar();
double sum = 0;
while(n -- )
{
double money;
char a[500];
gets(a);
char *p;
//用于接收函数返回的地址
p = strrchr(a,' ');
//strrchr函数为倒叙查找字符型数组当中某个字符第一次出现的作用并返回其地址,常用一个字符指针接收
sscanf(p,"%lf",&money);
//sscanf流能够读取p指针之后的内容并对其进行形式转换与变量赋值
sum += money;
}
cout << setiosflags(ios::fixed) << setprecision(1) << sum;
return 0;
}
1139: 字符串排序
题目描述
编一程序,用指针数组在主函数中输入n(n<10)个等长(长度<10)的字符串。用另一函数对它们排序,然后在主函数中输出n个已排好序的字符串。
输入
第一行为1个正整数n (n<10),然后是n行,每行一个字符串。
输出
n行排序后的字符串
样例输入
3
hij
def
abc
样例输出
abc
def
hij
源代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<string> A;
int main()
{
int n;
cin >> n;
getchar();
while(n -- )
{
string s;
getline(cin,s);
A.push_back(s);
}
sort(A.begin(),A.end());
for(int i = 0;i < A.size();i ++ )cout << A[i] << endl;
return 0;
}
1140: 矩阵转置
题目描述
编写一个包含指向数组的指针参数的函数,将3 3矩阵转置。
输入
输入一个3 3矩阵。
输出
将该矩阵转置后输出。
样例输入
1 2 3
4 5 6
7 8 9
样例输出
1 4 7
2 5 8
3 6 9
源代码
#include <iostream>
using namespace std;
const int N = 3;
int a[N][N];
void swap(int *p1,int *p2)
{
int t;
t = *p1;
*p1 = *p2;
*p2 = t;
}
void fun(int *p)
{
swap(*(p + 1),*(p + 3));
swap(*(p + 2),*(p + 6));
swap(*(p + 5),*(p + 7));
}
int main()
{
for(int i = 0;i < 3;i ++ )
{
for(int j = 0;j < 3;j ++ )
{
cin >> a[i][j];
}
}
int *p = &a[0][0];
fun(p);
for(int i = 0;i < 3;i ++ )
{
for(int j = 0;j < 3;j ++ )
{
cout << a[i][j] << ' ';
}
cout << endl;
}
return 0;
}
1141: 查找学生
题目描述
有一个班级,共n名学生,各学m门课程,请找出存在不及格课程的学生,并输出其全部成绩
输入
第一行为两个正整数n (n<10)和m (n<10)。然后是n行,第i行为第i名学生的m门课程的成绩,各门课程成绩用空格隔开。
输出
存在不及格课程的学生的m门课程成绩,每名学生占一行,成绩间用空格分隔。
样例输入
3 4
65 57 70 60
58 87 90 81
90 99 90 98
样例输出
1:65 57 70 60
2:58 87 90 81
源代码
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1000+10;
struct Student
{
int flag = 1;
int a[N];
void setdata(int n)
{
for(int i = 1;i <= n;i ++ )
{
cin >> a[i];
if(a[i] < 60)flag = 0;
}
}
void display(int n)
{
for(int i = 1;i <= n;i ++ )cout << a[i] << ' ';
cout << endl;
}
};
int main()
{
Student stu[20];
int n,m;
cin >> n >> m;
for(int i = 1;i <= n;i ++ )
{
stu[i].setdata(m);
}
for(int i = 1;i <= n;i ++ )
{
if(stu[i].flag== 0)
{
cout << i << ':';
stu[i].display(m);
}
}
return 0;
}
1142: 第k个学生的成绩
题目描述
有m个学生,每个学生有n门课程的成绩(0<m, n<10)。要求在用户输入学生序号以后,能输出该学生的全部成绩。用指针函数来实现。
输入
第一行输入三个正整数m, n, k;然后m行,每行为学生的序号及n门课程成绩(以空格分隔)。
输出
输出序号为k的学生的n门课成绩。
样例输入
3 4 2
60 70 80 90
56 89 67 88
34 78 90 66
样例输出
56 89 67 88
源代码
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1000+10;
struct Student
{
int a[N];
void setdata(int n)
{
for(int i = 1;i <= n;i ++ )
{
cin >> a[i];
}
}
void display(int n)
{
for(int i = 1;i <= n;i ++ )cout << a[i] << ' ';
cout << endl;
}
};
int main()
{
Student stu[20];
int n,m,idx;
cin >> n >> m >> idx;
Student *p = &stu[idx];
for(int i = 1;i <= n;i ++ )
{
stu[i].setdata(m);
}
p->display(m);
return 0;
}
1143: 最大值与最小值(利用指向函数的指针)
题目描述
使用指向函数的指针,实现求两个正数中的最大值与最小值。
输入
输入2个整数。
输出
最大值和最小值。
样例输入
1 2
样例输出
2 1
源代码
#include <iostream>
using namespace std;
int max(int a,int b)
{
if(a > b)return a;
else return b;
}
int min(int a,int b)
{
if(a < b)return a;
else return b;
}
int main()
{
//指向函数的指针定义为 指针类型(*指针名)(参数表) = 指向的函数名
int (*m)(int a,int b) = max;
int (*n)(int a,int b) = min;
int a,b;
cin >> a >> b;
cout << m(a,b) << ' ' << n(a,b);
return 0;
}
1144: 数组循环后移
题目描述
有n个整数,使前面各数顺序向后移动k个位置,移出的数再从开头移入。输出移动后的数组元素。
输入
输入分3行,第一行是一个整数n,第二行是n个整数,用空格隔开。第三行是一个整数k。
输出
输出n个整数,由空格隔开。输出占一行。
样例输入
6
1 2 3 4 5 6
2
样例输出
5 6 1 2 3 4
源代码
#include <iostream>
using namespace std;
const int N = 1000000+10;
int a[N],b[N];
int main()
{
int n;
cin >> n;
for(int i = 0;i < n;i ++ )cin >> a[i];
int k;
cin >> k;
for(int i = 0;i < n;i ++ )
{
b[i] = a[(i - k + n) % n];
cout << b[i] << ' ';
}
return 0;
}
1145: 降序存储
题目描述
已知数组a中有m个按升序序排列的元素,数组b中有n个降序排列的元素,编程将a与b中的所有元素按降序存入数组c中。
输入
输入有两行,第一行首先是一个正整数m,然后是m个整数;第二行首先是一个正整数n,然后是n个整数,m, n均小于等于1000000。
输出
输出合并后的m+n个整数,数据之间用空格隔开。输出占一行。
样例输入
4 1 2 5 7
3 6 4 2
样例输出
7 6 5 4 2 2 1
源代码
#include <iostream>
using namespace std;
const int N = 1000000+10;
int a[N],b[N],c[N];
int main()
{
int m;
cin >> m;
for(int i = 1;i <= m;i ++ )cin >> a[i];
int n;
cin >> n;
for(int i = 1;i <= n;i ++ )cin >> b[i];
int i = m,j = 1,k = 0;
while(i >= 1 && j <= n)
{
if(a[i] >= b[j])c[k ++ ] = a[i -- ];
else c[k ++ ] = b[j ++ ];
}
while(i >= 1)c[k ++ ] = a[i -- ];
while(j <= n)c[k ++ ] = b[j ++ ];
for(int i = 0;i < m + n;i ++ )cout << c[i] <<' ';
return 0;
}
1146: 实数的整数部分
题目描述
输入一个实数,输出实数的整数部分。注意该实数的位数不超过100位。输入的整数部分可能含有不必要的前导0,输出时应去掉,当然,若整数部分为0,则该0不能去掉。如输入0023.56732,输出应为23,而不是0023;0.123对应的输出应为0。当然输入也可能不含小数部分。
输入
输入一个实数。
输出
输出实数的整数部分
样例输入
0023.56732
样例输出
23
源代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
vector<int> A;
int main()
{
string pre;
string cur;
getline(cin,pre);
if(pre.find('.') != -1)
{
int idx = pre.find('.');
for(int i = 0;i < idx;i ++ )
{
cur = cur + pre[i];
}
}
else
{
cur = pre;
}
for(int i = cur.size() - 1;i >= 0;i -- )A.push_back(cur[i] - '0');
while(A.size() > 1 && A.back() == 0)A.pop_back();
for(int i = A.size() - 1;i >= 0;i -- )cout << A[i];
return 0;
}
1147: 实数的小数部分
题目描述
输入一个实数,输出该实数的小数部分,小数部分若多余的末尾0,请去掉。如输入111111.12345678912345678900则输出0.123456789123456789。若去掉末尾0之后小数部分为0,则输出“No decimal part”。注意该实数的位数不超过100位。
输入
输入一个实数。
输出
输出该实数的小数部分。
样例输入
111111.12345678912345678900
样例输出
0.123456789123456789
源代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
vector<char> A;
int main()
{
string s;
getline(cin,s);
string head,tail;
if(s.find('.'))
{
int idx = s.find('.');
head = "0.";
for(int i = idx + 1;i < s.size();i ++ )
{
A.push_back(s[i]);
}
while(A.size() > 1 && A.back() == '0')A.pop_back();
if(A.size() == 1 && A[0] == '0')cout<<"No decimal part";
else
{
cout<<head;
for(int i = 0;i < A.size();i ++ )cout << A[i];
}
}
else cout << "No decimal part";
return 0;
}
1148: 判断实数相等
题目描述
从键盘输入两个正实数,位数不超过200,试判断这两个实数是否完全相等。注意输入的实数整数部分可能有前导0,小数部分可能有末尾0。
输入
输入两个正实数a和b。
输出
如果两个实数相等,则输出Yes,否则输出No
样例输入
0023.56732 0023.56731
样例输出
No
源代码
输入的实数位数可能超过19位,显然用double类型无法表示, 只能用字符串存储。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<char> A,B;
int main()
{
string a,b;
cin >> a >> b;
for(int i = a.size() - 1;i >= 0;i -- )A.push_back(a[i]);
for(int i = b.size() - 1;i >= 0;i -- )B.push_back(b[i]);
while(A.size() > 1 && A.back() == '0')A.pop_back();
reverse(A.begin(),A.end());
while(A.size() > 1 && A.back() == '0')A.pop_back();
while(B.size() > 1 && B.back() == '0')B.pop_back();
reverse(B.begin(),B.end());
while(B.size() > 1 && B.back() == '0')B.pop_back();
if(A.size() != B.size())
{
cout<<"No";
return 0;
}
else
{
for(int i = 0;i < A.size()||i < B.size();i ++ )
{
if(A[i] != B[i])
{
cout<<"No";
return 0;
}
}
}
cout<<"Yes";
return 0;
}
1149: 部分逆置
题目描述
输入n个整数,把第i到j的全部元素进行逆置(1≤i≤j≤n),输出逆置后的n个数。要求使用指向数组元素的指针变量完成。
输入
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。
每组测试数据首先输入n,i,j(1≤i≤j≤n),然后再输入n个整数。
输出
对于每组测试数据,输出逆置后的n个整数。每两个数据之间留一个空格。
样例输入
2
7 2 6 11 22 33 44 55 66 77
5 1 5 11 22 33 44 55
样例输出
11 66 55 44 33 22 77
55 44 33 22 11
源代码
#include <iostream>
using namespace std;
void swap(int *a,int *b)
{
int t;
t = *a;
*a = *b;
*b = t;
}
int main()
{
int t;
cin >> t;
while(t -- )
{
int n,l,r;
cin >> n >> l >> r;
int *p = new int [n + 1];
for(int i = 1;i <= n;i ++ )cin >> p[i];
for(int i = l,j = r;i < j;i ++ ,j -- )
{
int *p1 = &p[i];
int *p2 = &p[j];
swap(p1,p2);
}
for(int i = 1;i <= n;i ++ )cout << p[i] << ' ';
delete [] p;
cout << endl;
}
}
1150: 歌唱大赛
题目描述
好多同学报名参加了英语俱乐部举办的“英文金曲歌唱大赛”活动,小明自告奋勇接下了计算总分的任务。每名选手均有5位评委打分,要求对每名选手去掉一个最高分、去掉一个最低分,再计算剩下打分的平均分(结果精确到小数点后两位)。
输入
测试数据包括多个实例,每个实例一行,包括选手姓名(姓名无空格且长度不超过20个字符),随后是5个实数代表评委打分。
输出
每位选手姓名和最终得分。
样例输入
bbz 1 2 3 4 5
cmt 5 6 7 8 9
ggx 6 7 8 9 10
样例输出
bbz 3.00
cmt 7.00
ggx 8.00
源代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <iomanip>
using namespace std;
const int N = 10;
string name;
int a[N];
int main()
{
while(cin >> name)
{
memset(a,0,sizeof(a));
for(int i = 1;i <= 5;i ++ )cin >> a[i];
sort(a + 1,a + 1 + 5);
double aver = 0;
for(int i = 2;i <= 4;i ++ )aver += a[i];
aver = aver * 1.0 / 3;
cout << name << ' ' << setiosflags(ios::fixed) << setprecision(2) << aver << endl;
}
}