习题2.1 与7无关的数(PKU)
#include<bits/stdc++.h>
using namespace std;
int n,ans;
bool check(int x){
if(x%7==0) return false;
while(x!=0){
if(x%10==7){
return false;
}
x/=10;
}
return true;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
if(check(i)){
ans+=i*i;
}
}
cout<<ans<<endl;
}
习题2.2 百鸡问题(HIT)
#include<bits/stdc++.h>
using namespace std;
int n;
int main(){
cin>>n;
for(int x=0;x<=n/5;x++){
for(int y=0;y<=n/3;y++){
int z=100-x-y;
if(z<0) continue;
if(5*x+3*y+(double)z/3<=n){
cout<<"x="<<x<<",y="<<y<<",z="<<z<<endl;
}
}
}
}
习题2.3 Old Bill(SJTU)
#include<bits/stdc++.h>
using namespace std;
bool ok=false;
int n,x,y,z,A,B,C;
void solve(){
for(int a=9;a>=1;a--){
for(int b=9;b>=0;b--){
int total=10000*a+x*1000+100*y+10*z+b;
if(total%n==0){
A=a,B=b,C=total/n;
ok=true;
return;
}
}
}
}
int main(){
while(cin>>n>>x>>y>>z){
ok=false;
solve();
if(ok){
cout<<A<<" "<<B<<" "<<C<<endl;
}
else{
cout<<0<<endl;
}
}
}
习题2.4 Repeater(PKU)
#include<bits/stdc++.h>
using namespace std;
char pattern [6][6];
char m[3000][3000];
char ans[3000][3000];
int len,n,q;
void update(int x,int y,bool flag){
for(int i=0;i<len;i++){
for(int j=0;j<len;j++){
if(flag){
ans[x+i][y+j]=m[i][j];
}
else{
ans[x+i][y+j]=' ';
}
}
}
}
int main(){
while(cin>>n){
if(n==0) break;cin.get();
for(int i=0;i<n;i++){
cin.getline(pattern[i],6);
}
cin>>q;
for(int k=0;k<q;k++){
len=pow(n,k);
if(len==1){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
m[i][j]=pattern[i][j];
ans[i][j]=m[i][j];
}
}
}
else{
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(pattern[i][j]==' '){
update(i*len,j*len,false);
}
else{
update(i*len,j*len,true);
}
}
}
for(int i=0;i<len*n;i++){
for(int j=0;j<len*n;j++){
m[i][j]=ans[i][j];
}
}
}
}
len=pow(n,q);
for(int i=0;i<len;i++){
for(int j=0;j<len;j++){
cout<<ans[i][j];
}
cout<<endl;
}
}
}
习题2.5 Hello World for U(ZJU)
#include<bits/stdc++.h>
using namespace std;
string s;
char ans[80][80];
int n;
int main(){
while(getline(cin,s)){
for(int i=0;i<80;i++){
for(int j=0;j<80;j++){
ans[i][j]=' ';
}
}
int n=s.length();
int x=(n+2)/3;
int y=n-2*x+2;
for(int i=0;i<=x-1;i++){
ans[i][0]=s[i];
ans[i][y-1]=s[n-1-i];
}
for(int j=1;j<=y-2;j++){
ans[x-1][j]=s[x-1+j];
}
for(int i=0;i<=x-1;i++){
for(int j=0;j<=y-1;j++){
cout<<ans[i][j];
}
cout<<endl;
}
}
}
习题2.6 日期差值(SJTU)
#include<bits/stdc++.h>
using namespace std;
char a[9],b[9];
int daytab[2][13]={
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
int ans=1;
bool IsLeapYear(int year){
return year%400==0||year%4==0&&year%100!=0;
}
int NumberOfYear(int year){
if(IsLeapYear(year)){
return 366;
}
else{
return 365;
}
}
int main(){
int year1,month1,day1;
int year2,month2,day2;
while(cin>>a>>b){
sscanf(a,"%4d%2d%2d",&year1,&month1,&day1);
sscanf(b,"%4d%2d%2d",&year2,&month2,&day2);
while(year1<year2||month1<month2||day1<day2){
day1++;
if(day1==daytab[IsLeapYear(year1)][month1]+1){
month1++;
day1=1;
}
if(month1==13){
year1++;
month1=1;
}
ans++;
}
cout<<ans<<endl;
}
}
习题2.7 Day of Week(SJTU)
#include<bits/stdc++.h>
using namespace std;
map<string,int> mp({{"January",1},{"February",2},{"March",3},{"April",4},{"May",5},{"June",6},
{"July",7},{"August",8},{"September",9},{"October",10},{"November",11},{"December",12}});
map<int,string>mp2({{0,"Sunday"},{1,"Monday"},{2,"Tuesday"},{3,"Wednesday"},{4,"Thursday"},{5,"Friday"},{6,"Saturday"}});
int daytab[2][13]={
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
bool IsLeapYear(int year){
return year%400==0||year%4==0&&year%100!=0;
}
int NumberOfYear(int year){
if(IsLeapYear(year)){
return 366;
}
return 365;
}
string s;
int main(){
while(getline(cin,s)){
stringstream ss(s);
int day,month,year;string m;
ss>>day;ss>>m;month=mp[m];ss>>year;
int number=0;
int row=IsLeapYear(year);
for(int j=0;j<month;j++){
number+=daytab[row][j];
}
number+=day;
for(int i=2;i<=year;i++){
number+=NumberOfYear(i-1);
}
number%=7;
cout<<mp2[number]<<endl;
}
}
习题2.8 日期类(BIT)
#include<bits/stdc++.h>
using namespace std;
int daytab[2][13]={
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
bool IsLeapYear(int year){
return (year%400==0)||(year%4==0&&year%100==0);
}
int m;
int year,day,month;
int main(){
cin>>m;
while(m--){
cin>>year>>month>>day;
day+=1;
if(day>daytab[IsLeapYear(year)][month]){
day=1;
month++;
}
if(month>12){
month=1;
year++;
}
printf("%04d-%02d-%02d\n",year,month,day);
}
}
习题2.9 Grading(ZJU)
#include<bits/stdc++.h>
using namespace std;
int P,T,G1,G2,G3,GJ;double ans;
int main(){
while(cin>>P>>T>>G1>>G2>>G3>>GJ){
if(abs(G1-G2)<=T){
ans=(double)(G1+G2)/2;
}
else if(abs(G1-G3)<=T||abs(G2-G3)<=T){
if(abs(G1-G3)<=T&&abs(G2-G3)<=T){
ans=max(G1,max(G2,G3));
}
else{
if(abs(G1-G3)>=(G2-G3)){
ans=(double)(G1+G3)/2;
}
else{
ans=(double)(G2+G3)/2;
}
}
}
else{
ans=GJ;
}
printf("%.1f\n",ans);
}
}
习题2.10 路径打印(SJTU)
#include<bits/stdc++.h>
using namespace std;
int n;
string path[11];
vector<string> pre,now;
void solve(){
for(int j=0;j<n;j++){
cin>>path[j];
}
sort(path,path+n);
for(int j=0;j<n;j++){
for(int i=0;i<path[j].size();i++){
if(path[j][i]=='\\'){
path[j][i]=' ';
}
}
stringstream ss(path[j]);
string tmp;
while(ss>>tmp){
now.push_back(tmp);
}
int p1=0,p2=0,retract=0;
while(p1<pre.size()&&p2<now.size()&&pre[p1]==now[p2]){
p1++;p2++;retract+=2;
}
for(;p2<now.size();p2++){
for(int i=0;i<retract;i++){
cout<<" ";
}
cout<<now[p2]<<endl;
retract+=2;
}
pre=now;
now.clear();
}
}
int main(){
while(cin>>n&&n!=0){
solve();
cout<<endl;
}
}
习题2.11 坠落的蚂蚁(PKU)
参考链接
#include<bits/stdc++.h>
using namespace std;
struct ant{
int pos,v;
bool operator<(const ant & p) const{
return pos<p.pos;
}
}arr[100];
vector<ant> l,r;
int n,a;
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>arr[i].pos>>arr[i].v;
if(arr[i].v==0) a=i;
}
for(int i=0;i<n;i++){
if(arr[i].pos<arr[a].pos&&arr[i].v>0){
l.push_back(arr[i]);
}
if(arr[i].pos>arr[a].pos&&arr[i].v<0){
r.push_back(arr[i]);
}
}
sort(l.begin(),l.end());
sort(r.begin(),r.end());
int l1=l.size(),l2=r.size();
if(l1==l2){
cout<<"Cannot fall!\n";
}
else if(l1<l2){
cout<<r[l1].pos<<endl;
}
else {
cout<<100-l[l1-l2-1].pos<<endl;
}
}