第一阶段:入门(20211124)
1720 A+B (十六进制)
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int main(){
int a,b;
while(scanf("%x %x",&a,&b)!=EOF){
//八进制 %o
//二进制 %
printf("%d\n",a+b);
}
return 0;
}
1062 Text Reverse(!!!)
思路,遇到空格时,反向输出之前的后再输出空格
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int main(){
int n;
while(cin>>n){
getchar();
for(int m=0;m<n;m++){
//getchar(); //接收回车,因为回车是输出的,所以输入的缓冲区里没有回车。。。
char str[1000];
gets(str);
//int length=sizeof(str)/sizeof(str[0]); //输出1000
int length=strlen(str);
char c;
//把输入的字符串整体反转,然后再把其中每个词反转,总是想变成个数组后再输出,但好像大多数都是直接输出的
/*for(int i=0;i<length/2;i++){
c=str[i];
str[i]=str[length-1-i];
str[length-1-i]=c;
}
puts(str);
*/
int flag=0;//记录空格的位置,初始化为0
for(int i=0;i<length;i++){
if(str[i]==' ' || i==length-1){ //str[i]=' '或字符串的最后一个字符时
if(i==length-1 && str[i]!=' ') i++; //如果是字符串的最后一个字符,则应将i加1,即将不存在的str[length]当做空格
//反向输出2个空格之间的字符串
for(int j=i-1;j>=flag;j--){
putchar(str[j]);
}
if(i!=length) //到达最后一个字符时,不在输出空格,因为之前i加了1,所以这里判断的是i!=length
putchar(' ');
flag=i+1;
}
}
printf("\n");
}
}
return 0;
}
问题1:除了第一个,其他的都少了第一个字母?
将getchar()放到输入3之后,for循环输入字符串之前
问题2:最后一个字符为空格时,输出不正确
当最后一个字符为空格时,不再i++
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int main(){
int n;
while(cin>>n){
getchar();
for(int m=0;m<n;m++){
char str[1000];
gets(str);
int length=strlen(str);
int flag=0;
for(int i=0;i<length;i++){
if(str[i]==' ' || i==length-1){
if(i==length-1 && str[i]!=' ') i++;
for(int j=i-1;j>=flag;j--){
putchar(str[j]);
}
if(i!=length) putchar(' ');
flag=i+1;
}
}
printf("\n");
}
}
return 0;
}
参考:https://blog.youkuaiyun.com/GD_ONE/article/details/84077051
将字符串整体反转
2104 hide hangkerchief(!!!)
输入3,2
则A,B,C
,他最先在A,则先找与A相隔(2-1)的C,再找与C相隔(2-1)的B,再找与B相隔(2-1)的A,因为遍历了ABC,所以他可以找到
之后的做法:
https://blog.youkuaiyun.com/Shishishi888/article/details/89225150
辗转相除法求最大公因式
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int main(){
int n,m;
while(cin>>n>>m){
if(n==-1 && m==-1) break;
//找出n和m的最大公约数是否为1
int a=n%m; //152=1997%615
while(a!=0){
int temp=a;
a=m%a; //7=615%152 //模作为被除数
m=temp; //被除数作为除数
}
if(m==1)
cout<<"YES"<<endl;
else
cout<<"POOR Haha"<<endl;
}
return 0;
}
1064 Financial Management
grab hold of 抓住
balance 收支相抵
penny 便士
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int main(){
double n,sum=0;
for(int i=0;i<12;i++){
cin>>n;
sum+=n;
}
double average=sum/12;
printf("$%.2f\n",average);
return 0;
}
四舍五入的实现
https://blog.youkuaiyun.com/xdz78/article/details/45080867
2734 Quicksum
validate:认为…有效
undesirable:不被欢迎的,不需要的,不良的
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int main(){
char s[300];
//while(gets(s) && s[0]!='#'){
while(cin.getline(s,300) && s[0]!='#'){ //c的gets(s)或c++的cin.getline(s,500)
int sum=0;
for(int i=0;i<strlen(s);i++){
if(s[i]!=' ') sum+=(s[i]-64)*(i+1);
}
printf("%d\n",sum);
}
return 0;
}
https://blog.youkuaiyun.com/qq_42025235/article/details/105419300
1170 a+b;a-b;a*b;a/b
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int main(){
int n,a,b;
char oper;
cin>>n;
//while(cin>>n){
for(int i=0;i<n;i++){
int sum=0;
cin>>oper>>a>>b;
if(oper!='/'){
switch(oper){
case '+':sum=a+b;break;
case '-':sum=a-b;break;
case '*':sum=a*b;break;
}
cout<<sum<<endl;
}
else{
// The result should be rounded to 2 decimal places If and only if it is not an integer. !!!
if(a%b!=0)
printf("%.2f\n",a*1.0/b);
else printf("%d\n",a/b);
}
}
//}
return 0;
}
1197 Specialized Four-Digit Numbers(专门的四位数?)
specialized 专门的,专业的
digit 数字,手指,脚趾,数位
digital 数字的,数码的,数字显示的,手指的
decimal adj.十进制的,小数的;n.十进制,小数
notation n.符号,注释,标记法
4位数中十进制的每一位相加=12进制的每一位相加=16进制的每一位相加
的数
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int sum_10(int n){
int a1=n/1000;
int a2=(n-a1*1000)/100;
int a3=(n-a1*1000-a2*100)/10;
int a4=n%10;
return a1+a2+a3+a4;
}
int sum_12(int n){
//每次都除12的余数相加,直至商为0
int sum=0;
while(n>0){
sum+=n%12;
n=n/12;
}
return sum;
}
int sum_16(int n){
int sum=0;
while(n>0){
sum+=n%16;
n=n/16;
}
return sum;
}
int main(){
for(int i=2992;i<=9999;i++){
if(sum_10(i)==sum_12(i) && sum_10(i)==sum_16(i))
cout<<i<<endl;
}
return 0;
}
求n进制每一位数的方法
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int sum(int n,int d){ //n为十进制数,d为十进制或十二进制或十六进制
//每次都除12的余数相加,直至商为0
int sum=0;
while(n>0){
sum+=n%d;
n=n/d;
}
return sum;
}
int main(){
for(int i=2992;i<=9999;i++){
if(sum(i,10)==sum(i,12) && sum(i,10)==sum(i,16))
cout<<i<<endl;
}
return 0;
}
2629 Identity Card
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int main(){
int n,a,b;
string id;
cin>>n;
for(int i=0;i<n;i++){
cin>>id;
//int x=id[0]*10+id[1]; //id[0]是char,这是再用他的asscii码相乘
int x=(id[0]-'0')*10+(id[1]-'0');
string from;
string year=id.substr(6,4); //substr(开始位置,截取长度)
string month=id.substr(10,2);
string day=id.substr(12,2);
switch(x){
case 33:from="Zhejiang";break;
case 11:from="Beijing";break;
case 71:from="Taiwan";break;
case 81:from="Hong Kong";break;
case 82:from="Macao";break;
case 54:from="Tibet";break;
case 21:from="Liaoning";break;
case 31:from="Shanghai";break;
}
cout<<"He/She is from "<<from<<",and his/her birthday is on "<<month<<","<<day<<","<<year<<" based on the table."<<endl;
}
return 0;
}