1.abc
数值转换。
#include<iostream>
using namespace std;
int main(){
int a,b,c;
for(a=1;a<10;a++)
for(b=1;b<10;b++)
for(c=0;c<10;c++)
if((12*c+110*b+100*a)==532)
cout<<a<<" "<<b<<" "<<c<<endl;
}
2.反序数
数值转换题,枚举法。
#include<iostream>
using namespace std;
int main(){
int a,b,c,d,num,num_t,num_r;
for(a=1;a<10;a++)
for(b=0;b<10;b++)
for(c=0;c<10;c++)
for(d=1;d<10;d++){
num = 1000*a+100*b+10*c+d;
num_r = 1000*d+100*c+10*b+a;
num_t = num*9;
if(num_t < 10000)
if(num_t == num_r)
cout<<num<<endl;
}
}
3.对称平方数
数值转换,按位取余,两端判等,函数调用。
#include<iostream>
using namespace std;
bool equalNum(int n, int num){
int s[n],i=0,j=0;
while(num>0){
s[i] = num % 10;
num = num / 10;
i++;
}
while(j < (n-1-j)){
if(s[j] == s[n-1-j])
j++;
else
return false;
}
return true;
}
int main(){
int num,snum;
for(num=0;num<=256;num++){
snum = num*num;
if(snum >= 10000){
if(equalNum(5,snum))
cout<<num<<endl;
}else if(snum >= 1000){
if(equalNum(4,snum))
cout<<num<<endl;
}else if(snum >= 100){
if(equalNum(3,snum))
cout<<num<<endl;
}else if(snum >= 10){
if(equalNum(2,snum))
cout<<num<<endl;
}else{
cout<<num<<endl;
}
}
}
4.与7无关数
与7有关的条件取反且取交集。
#include<iostream>
using namespace std;
bool check(int num){
while(num>0){
if(num%10 != 7)
num = num/10;
else
return false;
}
return true;
}
int main(){
int n,sum=0;
while(cin>>n){
for(int i=1;i<=n;i++){
if(i%7!=0 && check(i))
sum += i*i;
}
cout<<sum<<endl;
}
}
5.百鸡问题
难点就一个节省枚举数量的判断。
#include<iostream>
using namespace std;
int checkMax(int num){
if(num>100)
return 100;
else
return num;
}
int main(){
int n,x,y,z;
while(cin>>n)
for(x = 0; x <= checkMax(n/5); x++)
for(y = 0; y <= checkMax(n/3); y++)
for(z = 0; z <= checkMax(3*n); z++){
float z_s;
z_s = ((float)z)/3;
if(x+y+z == 100 && (5*x+3*y+z_s) <= n)
cout<<"x="<<x<<",y="<<y<<",z="<<z<<endl;
}
}
6.Old Bill
数学条件判断题,在无解时输出零处添加了一个布尔值判断,改变条件跳出双层嵌套循环。
#include<iostream>
using namespace std;
int main(){
int n,x,y,z;
int a,b,price;
bool p_print;
while(cin>>n){
cin>>x>>y>>z;
p_print = true;
for(a=9;a>0;a--){
for(b=9;b>=0;b--){
price = 10000*a+1000*x+100*y+10*z+b;
if(price % n == 0){
cout<<a<<" "<<b<<" "<<price/n<<endl;
p_print = false;
a=0;
b=-1;
}
}
}
if(p_print)
cout<<"0"<<endl;
}
}
7.Hello World for U
打印成U形,且越接近正方形越好,即将其转化为矩形的长短边,其字符串长度为N,除去U型重复使用的两个端点,以(N-2)%3的余数来确定矩形的边长a,b
import java.util.Scanner;
public class Main{
public static void main(String args[]){
int n,a,b;
String str, blank=" ";
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
str = sc.nextLine();
n = str.length();
if((n-2)%3 == 0){
a = (n-2)/3+1;
b = (n-2)/3+2;
}else if((n-2)%3 == 1){
a = (n-2)/3+1;
b = (n-2)/3+3;
}else if((n-2)%3 == 2){
a = (n-2)/3+2;
b = (n-2)/3+2;
}else{
a = 0;
b = 0;
}
for(int i=0; i<a-1; i++){
for(int j=0; j<b; j++){
if(j==0)
System.out.print(str.charAt(i));
else if(j==(b-1))
System.out.print(str.charAt(n-1-i));
else
System.out.print(blank);
}
System.out.println();
}
for(int k=0; k<b; k++)
System.out.print(str.charAt(a-1+k));
System.out.println();
}
}
}
8.今年第几天
省去繁琐地判断月份的天数,直接用数组存储。
#include<iostream>
using namespace std;
int main(){
int y,m,d,td;
int n_y[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int abn_y[12]={31,29,31,30,31,30,31,31,30,31,30,31};
while(cin>>y>>m>>d){
td = 0;
if((y%4==0 && y%100!=0)||(y%400==0)){
for(int i=0; i<m-1; i++)
td += abn_y[i];
}else{
for(int i=0; i<m-1; i++)
td += n_y[i];
}
td += d;
cout<<td<<endl;
}
}
9.打印日期
注意在判断输入的天数和每个月天数的比较,else要加break,否则在末尾几天会出现月份多加1的情况,原理同上。
#include<iostream>
using namespace std;
int main(){
int y,m,d;
int n_y[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int abn_y[12]={31,29,31,30,31,30,31,31,30,31,30,31};
while(cin>>y>>d){
m = 1;
if((y%4==0 && y%100!=0)||(y%400==0)){
for(int i=0; i<12; i++){
if(d>abn_y[i]){
d -= abn_y[i];
m++;
}else
break;
}
}else{
for(int i=0; i<12; i++){
if(d>n_y[i]){
d -= n_y[i];
m++;
}else
break;
}
}
if(y<10)
cout<<"000"<<y<<"-";
else if(y<100)
cout<<"00"<<y<<"-";
else if(y<1000)
cout<<"0"<<y<<"-";
else
cout<<y<<"-";
if(m<10)
cout<<"0"<<m<<"-";
else
cout<<m<<"-";
if(d<10)
cout<<"0"<<d<<endl;
else
cout<<d<<endl;
}
}
10.日期类
C++中include调用scanf和printf的stdio头文件,%2d表示对齐,%02d表示不足位补零;
考虑跨月份、跨年份时间发生;
第九题中,如果使用cout输出流的话补位十分繁琐,故我用的是比较笨的方法,与第十题作对比。
#include<iostream>
#include<stdio.h>
using namespace std;
int main(){
int m;
cin>>m;
int mmdd[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int yy,mm,dd;
for(int i=0;i<m;i++){
cin>>yy>>mm>>dd;
if(mm==12 && dd == mmdd[11]){
yy += 1;
mm = 1;
dd = 1;
}else if(dd == mmdd[mm-1]){
mm += 1;
dd = 1;
}else
dd += 1;
printf("%04d-%02d-%02d\n",yy,mm,dd);
}
}
11.日期差值
千万记得题目的要求是天数间隔是差值+1,转换成当年的第几天,然后再算相差天数。
#include<iostream>
using namespace std;
bool leapYear(int y){
if((y%4==0 && y%100!=0)||y%400==0)
return true;
else
return false;
}
int numDay(int y, int m, int d){
int td=0;
int nleap[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int leap[12] = {31,29,31,30,31,30,31,31,30,31,30,31};
if(leapYear(y))
for(int i=0; i<m-1; i++)
td += leap[i];
else
for(int i=0; i<m-1; i++)
td += nleap[i];
td += d;
return td;
}
void gapDay(int y1, int y2, int d1, int d2){
int y,gd;
y = y1-y2;//Make sure the biggest one is y1/d1
if(y == 0){
gd = d1-d2+1;
}else{
if(leapYear(y2))
gd = (366-d2) + (y-1)*365 + y/4 + d1 + 1;
else
gd = (365-d2) + (y-1)*365 + y/4 + d1 + 1;
}
cout<<gd<<endl;
}
int main(){
int d1,d2;
int p1,p2;
int y1,y2,m1,m2,n1,n2;
while(cin>>d1>>d2){
y1 = d1/10000;
y2 = d2/10000;
m1 = (d1 - y1*10000)/100;
m2 = (d2 - y2*10000)/100;
n1 = d1 - y1*10000 - m1*100;
n2 = d2 - y2*10000 - m2*100;
p1 = numDay(y1,m1,n1);
p2 = numDay(y2,m2,n2);
if(d1>d2)
gapDay(y1,y2,p1,p2);
else
gapDay(y2,y1,p2,p1);
}
}
12.剩下的树
比较粗暴,想过拆分数组的方法,但是可能输入的区间重复率低,拆分出的区间个数太多(我自己水平不够)还是需要通过数组实现,就还是采用的标志位方法。
#include<iostream>
using namespace std;
int main(){
int l,m,a,b,leftT;
while(cin>>l>>m){
leftT = l+1;
int tree[l+1];
for(int i=0; i<l+1; i++)
tree[i] = 0;
for(int i=0; i<m; i++){
cin>>a>>b;
for(int j=a; j<b+1; j++){
if(tree[j] == 0){
leftT--;
tree[j] = 1;
}
}
}
cout<<leftT<<endl;
}
}
13.日期累加
我必须喷一下某些题的用例,属实故障+智障。
(某人检查过后,发现是我自己少打了一个换行符 = = dbq)
这个题其实有挺多种解法,我个人认为比较简单的一种是:累加天数减掉之后每个月的天数,直到剩下的累加天数能够停留在一个月内。
#include<iostream>
#include<cstdio>
using namespace std;
bool leapYear(int y){
if((y%4==0 && y%100!=0)||y%400==0)
return true;
else
return false;
}
void nowDay(int y, int m, int d, int pd){
int ly[12] = {31,29,31,30,31,30,31,31,30,31,30,31};
int nly[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
while(pd>0){
if(leapYear(y)){
if(pd<=ly[m-1]-d){
d += pd;
printf("%04d-%02d-%02d\n",y,m,d);
break;
}else{
pd = pd-(ly[m-1]-d+1);
if(m<12)
m++;
else{
y++;
m = 1;
}
d = 1;
}
}else{
if(pd<=nly[m-1]-d){
d += pd;
printf("%04d-%02d-%02d\n",y,m,d);
break;
}else{
pd = pd-(nly[m-1]-d+1);
if(m<12)
m++;
else{
y++;
m = 1;
}
d = 1;
}
}
}
}
int main(){
int n;
cin>>n;
int y,m,d,pd;
for(int i=0; i<n; i++){
cin>>y>>m>>d>>pd;
nowDay(y,m,d,pd);
}
}
14.Day of week
case通过率只有85%,不知道为什么……(可能是我算法太复杂了?)
我的想法是,以当天为标志,判断日期差值,然后根据前后且%7的值,判断周几(但不知道为什么到2101年会多一天……)
欢迎看出问题的大佬可以告诉我……
#include<iostream>
#include<cstdio>
using namespace std;
bool leapYear(int y){
if((y%4==0&&y%100!=0)||y%400==0)
return true;
else
return false;
}
int convertMonth(string m){
if(m == "January")
return 1;
else if(m == "February")
return 2;
else if(m == "March")
return 3;
else if(m == "April")
return 4;
else if(m == "May")
return 5;
else if(m == "June")
return 6;
else if(m == "July")
return 7;
else if(m == "August")
return 8;
else if(m == "September")
return 9;
else if(m == "October")
return 10;
else if(m == "November")
return 11;
else if(m == "December")
return 12;
else
return 0;
//solve the warning
}
string convertWeekday(int weekday, bool before){
if(before){
switch(weekday){
//2020.3.7 is Saturday
case 5: return "Monday";
case 4: return "Tuesday";
case 3: return "Wednesday";
case 2: return "Thursday";
case 1: return "Friday";
case 0: return "Saturday";
case 6: return "Sunday";
}
}else{
switch(weekday){
case 2: return "Monday";
case 3: return "Tuesday";
case 4: return "Wednesday";
case 5: return "Thursday";
case 6: return "Friday";
case 0: return "Saturday";
case 1: return "Sunday";
}
}
}
int calDay(int y, int m, int d){
int lpy[12] = {31,29,31,30,31,30,31,31,30,31,30,31};
int nlpy[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
if(leapYear(y))
for(int i=0;i<m-1;i++)
d += lpy[i];
else
for(int j=0;j<m-1;j++)
d+= nlpy[j];
return d;
}
int main(){
int d,y;
string m;
int nowd,testd;
while(cin>>d>>m>>y){
nowd = calDay(2020,3,7);//Set today as the target
testd = calDay(y,convertMonth(m),d);
if(y<2020){
if(leapYear(y)){
nowd += 366-testd+(2020-y-1)*365+(2020-y)/4;
}else{
nowd += 365-testd+(2020-y-1)*365+(2020-y)/4;
}
cout<<convertWeekday(nowd%7,true)<<endl;
}else if(y == 2020){
if(testd>nowd)
cout<<convertWeekday((testd-nowd)%7,false)<<endl;
else
cout<<convertWeekday((nowd-testd)%7,true)<<endl;
}
else{
testd += 366-nowd+(y-2020-1)*365+(y-2020)/4;
cout<<convertWeekday(testd%7,false)<<endl;
}
}
}
15.Grading
分情况讨论,输出时注意保留一位小数。
#include<iostream>
#include<cstdio>
using namespace std;
int getDif(int a, int b){
if(a-b>=0)
return a-b;
else
return b-a;
}
int getMax(int a, int b, int c){
if((a>b && b>c)||(a>c && c>b))
return a;
else if((b>a && a>c)||(b>c && c>a))
return b;
else
return c;
}
int main(){
int p,t,g1,g2,g3,gj;
while(cin>>p>>t>>g1>>g2>>g3>>gj){
if(getDif(g1,g2)<=t){
printf("%.1f",((float)g1+g2)/2);
continue;
}else if(getDif(g1,g3)<=t && getDif(g2,g3)>t){
printf("%.1f",((float)g1+g3)/2);
continue;
}else if(getDif(g2,g3)<=t && getDif(g1,g3)>t){
printf("%.1f",((float)g1+g3)/2);
continue;
}else if(getDif(g2,g3)<=t && getDif(g1,g3)<=t){
printf("%.1d",getMax(g1,g2,g3));
}else if(getDif(g2,g3)>=t && getDif(g1,g3)>=t){
printf("%.1d",gj);
}
}
}
16.排序
这道题用来复习各种排序算法的实现。
这一部分的代码也会更新在数据结构部分。
1)直接插入排序
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int n,tag,temp;
while(cin>>n){
//InsertSort seems like the best choice
int num[n];
for(int i=0; i<n; i++){
cin>>num[i];
tag = i;
while(tag>0){
if(num[tag]<num[tag-1]){
temp = num[tag-1];
num[tag-1] = num[tag];
num[tag] = temp;
tag--;
}else
break;
}
}
for(int i=0; i<n; i++)
cout<<num[i]<<" ";
cout<<endl;
}
}
2)冒泡排序
马泡泡排序,注意swap不要写错了。
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int n,temp;
bool change;
while(cin>>n){
//InsertSort seems like the best choice
int num[n];
for(int i=0;i<n;i++)
cin>>num[i];
change = true;
for(int i=0; i<n-1; i++){
if(change){
change = false;
for(int j=0; j<n-i-1; j++){
if(num[j]>num[j+1]){
temp = num[j];
num[j] = num[j+1];
num[j+1] = temp;
change = true;
}
}
}else
break;
}
for(int i=0; i<n; i++)
cout<<num[i]<<" ";
cout<<endl;
}
}
3)快速排序
分治法。(但本题其实插排最好,可以边输入边排序)
#include<iostream>
#include<cstdio>
using namespace std;
int tagPos(int num[], int low, int high){
int tag = num[low];
while(low<high){
while(low<high && num[high]>tag)
high--;
num[low]=num[high];
while(low<high && num[low]<tag)
low++;
num[high]=num[low];
}
num[low]=tag;
return low;
}
void QuickSort(int num[], int low, int high){
if(low<high){
int tl;
tl = tagPos(num,low,high);
QuickSort(num,low,tl-1);
QuickSort(num,tl+1,high);
}
}
int main(){
int n,tag,low,high,temp;
while(cin>>n){
//InsertSort seems like the best choice
int num[n];
for(int i=0;i<n;i++)
cin>>num[i];
QuickSort(num,0,n-1);
for(int i=0; i<n; i++)
cout<<num[i]<<" ";
cout<<endl;
}
}
4)algorithm库(c++)
c++的库中自带快排sort(起址,终址,升降序),要注意的是arr表传址,arr[0]表传值。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
int n,tag,temp;
while(cin>>n){
//InsertSort seems like the best choice
int num[n];
for(int i=0; i<n; i++)
cin>>num[i];
sort(num,num+n);
for(int i=0; i<n; i++)
cout<<num[i]<<" ";
cout<<endl;
}
}
17.成绩排序1
多个一维数组或多维数组联动时,快排的条件最好是用组合条件来判断是否需要交换。
#include<iostream>
#include<algorithm>
using namespace std;
//Try to write down the quicksort again
int getPos(int n[],int m[],int low,int high){
int tag1 = n[low],tag2 = m[low];
while(low<high){
while(low<high && tag1<n[high])
high--;
n[low]=n[high];
m[low]=m[high];
while(low<high && tag1>n[low])
low++;
n[high]=n[low];
m[high]=m[low];
}
n[low]=tag1;
m[low]=tag2;
return low;
}
void QuickSort(int n[],int m[],int low,int high){
if(low<high){
int tl = getPos(n,m,low,high);
QuickSort(n,m,low,tl-1);
QuickSort(n,m,tl+1,high);
}
}
int main(){
//two arrays
int n;
cin>>n;
int student[n];
int grade[n];
for(int i=0; i<n; i++)
cin>>student[i]>>grade[i];
QuickSort(grade,student,0,n-1);
int low,high;
for(int i=0; i<n; i++){
if(grade[i]!=grade[i+1] && i+1<n)
cout<<student[i]<<" "<<grade[i]<<endl;
else if(i==n-1)
cout<<student[i]<<" "<<grade[i]<<endl;
else{
low = i;
i++;
while(grade[i]==grade[i+1] && i+1<n)
i++;
if(i==n-1 && grade[i]==grade[i-1]){
sort(student+low,student+n);
for(int j=low; j<n; j++)
cout<<student[j]<<" "<<grade[low]<<endl;
break;
}else{
sort(student+low,student+i-1);
for(int j=low; j<i; j++)
cout<<student[j]<<" "<<grade[low]<<endl;
i--;
}
}
}
}
另,本题使用数据结构解题则代码体更简洁。
#include<iostream>
using namespace std;
typedef struct student{
int no;
int grade;
}student;
int main(){
int num;
while(cin>>num){
student p[num];
for(int i=0;i<num;i++)
cin>>p[i].no>>p[i].grade;
student temp;
bool swap = true;
for(int i=0;i<num-1;i++){
if(swap){
swap = false;
for(int j=0;j<num-i-1;j++){
if(p[j].grade>p[j+1].grade || (p[j].grade==p[j+1].grade && p[j].no>p[j+1].no)){
temp = p[j];
p[j] = p[j+1];
p[j+1] = temp;
swap = true;
}
}
}
}
for(int i=0;i<num;i++)
cout<<p[i].no<<" "<<p[i].grade<<endl;
}
}
18.成绩排序2
由于题中没有明确说一次输入多个测试用例,惯性思维导致我一直没有判断是否有继续输入。
本题即采用typedef struct自定义数据结构实现同步排序。
#include<iostream>
using namespace std;
typedef struct student{
string name;
int grade;
}student;
void sortASC(student s[], int num){
student temp;
bool swap = true;
for(int j=0;j<num-1;j++){
if(swap){
swap = false;
for(int i=0;i<num-1-j;i++){
if(s[i].grade > s[i+1].grade){
temp = s[i];
s[i] = s[i+1];
s[i+1] = temp;
swap = true;
}
}
}
}
}
void sortDESC(student s[], int num){
student temp;
bool swap = true;
for(int j=0;j<num-1;j++){
if(swap){
swap = false;
for(int i=num-1;i>j;i--){
if(s[i].grade > s[i-1].grade){
temp = s[i];
s[i] = s[i-1];
s[i-1] = temp;
swap = true;
}
}
}
}
}
int main(){
int num, way;
while(cin>>num>>way){
student p[num];
for(int i=0;i<num;i++)
cin>>p[i].name>>p[i].grade;
if(way==0)
sortDESC(p,num);
if(way==1)
sortASC(p,num);
for(int i=0;i<num;i++)
cout<<p[i].name<<" "<<p[i].grade<<endl;
}
}
当然algorithm库中的sort函数也支持升降序,但自定义数据结构无法单独将grade部分的地址独立出来从而形成连续地址进行处理。
19.特殊排序
首先这道题,我感觉应该想考察去重+部分输出,所以将所有最大值去掉然后输出的实现代码如下。(不是本题解!不是本题解!)
#include<iostream>
using namespace std;
int main(){
int num;
while(cin>>num){
int n[num];
int max = 0;
for(int i=0;i<num;i++){
cin>>n[i];
if(max<n[i])
max = n[i];
}
cout<<max<<endl;
int count = num;
for(int i=0;i<num;i++)
if(n[i]==max)
count--;
if(count==0){
cout<<-1<<endl;
}else{
int temp;
bool swap = true;
for(int i=0;i<num-1;i++){
if(swap){
swap = false;
for(int j=0;j<num-i-1;j++){
if(n[j]>n[j+1]){
temp = n[j];
n[j] = n[j+1];
n[j+1] = temp;
swap = true;
}
}
}
}
for(int i=0;i<count;i++)
cout<<n[i]<<" ";
cout<<endl;
}
}
}
然后是这道题的解,其实更加简单了一些,感觉是考察冒泡。
#include<iostream>
using namespace std;
int main(){
int num;
while(cin>>num){
int n[num];
for(int i=0;i<num;i++)
cin>>n[i];
int temp;
bool swap = true;
for(int i=0;i<num-1;i++){
if(swap){
swap = false;
for(int j=0;j<num-i-1;j++){
if(n[j]>n[j+1]){
temp = n[j];
n[j] = n[j+1];
n[j+1] = temp;
swap = true;
}
}
}
}
cout<<n[num-1]<<endl;
if(num-1==0){
cout<<-1<<endl;
}else{
for(int i=0;i<num-1;i++)
cout<<n[i]<<" ";
cout<<endl;
}
}
}
20.整数奇偶排序
暴力输出。
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int num[10];
while(cin>>num[0]>>num[1]>>num[2]>>num[3]>>num[4]>>num[5]>>num[6]>>num[7]>>num[8]>>num[9]){
sort(num,num+10);
for(int i=9;i>=0;i--)
if(num[i]%2!=0)
cout<<num[i]<<" ";
for(int i=0;i<10;i++)
if(num[i]%2==0)
cout<<num[i]<<" ";
}
}
21.小白鼠排序
考察数据结构。
#include<iostream>
using namespace std;
typedef struct mouse{
int weight;
string hat;
}mouse;
int main(){
int n;
while(cin>>n){
mouse m[n];
for(int i=0;i<n;i++)
cin>>m[i].weight>>m[i].hat;
mouse temp;
bool swap = true;
for(int i=0;i<n-1;i++){
if(swap){
swap = false;
for(int j=n-1;j>i;j--){
if(m[j].weight>m[j-1].weight){
temp = m[j];
m[j] = m[j-1];
m[j-1] = temp;
swap = true;
}
}
}
}
for(int i=0;i<n;i++)
cout<<m[i].hat<<endl;
}
}
22.查找
有序数列折半查找算法。
#include<iostream>
#include<algorithm>
using namespace std;
void quicksort(int a[], int low, int high){
int tag, left, right;
if(low<high){
left = low;
right = high;
tag = a[low];
while(low<high){
while(a[high]>tag && low<high)
--high;
a[low] = a[high];
while(a[low]<tag && low<high)
low++;
a[high] = a[low];
a[low] = tag;
}
quicksort(a,left,low-1);
quicksort(a,low+1,right);
}
}
bool findX(int a[], int low, int high, int tag){
int half = (low+high)/2;
if(low<=high){
if(tag == a[half])
return true;
else if(tag < a[half])
return findX(a,low,half-1,tag);
else if(tag > a[half])
return findX(a,half+1,high,tag);
}else
return false;
}
int main(){
int n,m;
while(cin>>n){
int a[n];
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
//quicksort(a,0,n-1);
cin>>m;
int input;
for(int i=0;i<m;i++){
cin>>input;
if(findX(a,0,n-1,input))
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
}
23. 浮点数加法
一开始看错题了,给个抽象表达式我以为是等位数加法,没有考虑对齐,实现如下:
#include <iostream>
#include <string>
//#include <vector>
using namespace std;
int main(){
string a,b;
//vector<string> result;
int add,lastAdd;
while(cin>>a>>b){
add=0,lastAdd=0;
for(int i=a.size()-1;i>=0;i--){
if(a[i] != '.'){
add = (a[i] - '0') + (b[i] - '0') + lastAdd;
a[i] = (char)((add % 10) + '0');
lastAdd = add/10;
}
}
if(lastAdd!=0)
cout<<lastAdd<<a<<endl;
// a = lastAdd.toString + a;
else
cout<<a<<endl;
}
}
等位加减的难点在于char与int的转换,同时cpp中可以对string的每一位做变换(虽然本质也是重新创建新string)但java只能访问不可操作。int作为char插入时,要加上基础char值。