算法之路3
1. A+B和C
给定区间[-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
代码:
#include <iostream> using namespace std; int main() { long int A,B,C; int T; int X=1; cin>>T; while(T--) { cin>>A>>B>>C; if(A+B>C) cout<<"Case #"<<X++<<": true"<<endl; else cout<<"Case #"<<X++<<": false"<<endl; } //system("PAUSE"); return 0; }
1012. 数字分类 (20)
给定一系列正整数,请按要求对数字进行分类,并输出以下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
- 代码:
#include <iostream> #include <iomanip> using namespace std; int main() { bool flag1=false; bool flag2=false; bool flag3=false; bool flag4=false; bool flag5=false; int N; int factor=1; int t=0; int A=0; int mod=0; int A1=0,A2=0,A3=0,A5=0; double A4=0; int k=0; cin>>N; while(N--) { cin>>t; A=t/5; mod=t%5; switch(mod) { case 0: if(A%2==0) {A1+=t;flag1=true;} break; case 1: A2 += factor*t; factor=-factor;flag2=true;break; case 2: A3++;flag3=true;break; case 3: A4+=t;k++;flag4=true;break; case 4: if(A5<t) A5=t;flag5=true;break; } } if (flag1) cout<< A1<<" "; else cout<<"N"<<" "; if (flag2) cout<< A2<<" "; else cout<<"N"<<" "; if (flag3) cout<< A3<<" "; else cout<<"N"<<" "; if (flag4) cout<<fixed<<setprecision(1)<<A4/k<<" "; else cout<<"N"<<" "; if (flag5) cout<<A5; else cout<<"N"; cout<<endl; //system("PAUSE"); return 0; }
1017. A除以B (20)
本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。
输入格式:
输入在1行中依次给出A和B,中间以1空格分隔。
输出格式:
在1行中依次输出Q和R,中间以1空格分隔。
输入样例:123456789050987654321 7
输出样例:17636684150141093474 3
代码:
#include <iostream> #include <string> using namespace std; int main() { int n,m=0; string str; cin>>str>>n; if(str.length()==1 &&str[0]-'0'<n) cout<<"0 "<<str[0]-'0'<<endl; else { for(int i=0;i<str.length();i++) { if(i>0 && m==0 && str[i]-'0'<n) cout<<"0"; m=m*10+str[i]-'0'; if(m/n>0) { cout<<m/n; m=m%n; } } cout<<" "<<m<<endl; } return 0; }
1021. 个位数统计 (15)
给定一个k位整数N = dk-1*10k-1 + ... + d1*101 + d0 (0<=di<=9, i=0,...,k-1, dk-1>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定N = 100311,则有2个0,3个1,和1个3。
输入格式:
每个输入包含1个测试用例,即一个不超过1000位的正整数N。
输出格式:
对N中每一种不同的个位数字,以D:M的格式在一行中输出该位数字D及其在N中出现的次数M。要求按D的升序输出。
输入样例:100311
输出样例:0:2 1:3 3:1
代码:#include <stdio.h> #include <string.h> #define MAX_LEN 1024 int main(void) { char str[MAX_LEN]; int table[10] = {0}; int i, len; scanf("%s", str); len = strlen(str); for(i = 0; i < len; i++) { table[str[i]-'0']++; } for(i = 0; i < sizeof(table)/sizeof(table[0]); i++) { if(table[i] != 0) printf("%d:%d\n", i, table[i]); } return 0; }