概述
5.1.1WERTYU
#include<iostream>
using namespace std;
int main()
{
char ch[]="`1234567890-=qwertyuiop[]\asdfghjkl;'zxcvbnm,./"; //所有情况存入字符数组
int c,i;
while((c=getchar()!=EOF))
{
for(i=1;ch[i]&&ch[i]!=c;i++); //字符数组不为空且字符数组不等于输入数,就继续寻找
if(ch[i]) putchar(ch[i-1]); //找到相同为第i位,在不为空的情况输出前一个字母
else putchar(c); //找不到,为空则输出输入数
}
return 0;
}
5.1.2 TeX括号
#include<iostream>
using namespace std;
int main()
{
int c,flag=0; //利用flag 标志变量判断是左还是右
while((c=getchar())!=EOF)
{
if(c=='"')
{
if(flag==0) putchar("``"); flag=1;
else putchar("''");flag=0;
}
else
putchar(c);
}
return 0;
}
5.1.3周期串
#include<iostream>
using namespace std;
int main()
{
string s;
int i;
while(getline(cin,s)!=EOF)
{
int c=s[0];
for(i=1;i<s.length();i++)
{
if(s[i]==c&&s[i-1]==s[2*i-1]) break; //确定首尾一致
}
}
cout<<i;
return 0;
}
5.2.1小学生算术
#include<iostream>
using namespace std;
int main()
{
int a,b;
while(scanf("%d%d",&a,&b)==2)
{
if(a==0&&b==0) return;
int ans=0,c=0;
for(int i=9;i>0;i++)
{
c=(a%10)+(b%10)+c>9?1:0; //每次加上a,b最后两位,判断是否大于9,大于就为1
//最精彩的是因为相加最多进位一位,所以用三元运算符,满足条件直接赋值1完全可以
ans+=c; //将每次判断结果加起来
b/=10; //a,b都向前进一位
a/=10;
}
cout<<ans<<endl;
}
return 0;
}
5.2.2阶乘的精确值
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int maxn = 3000;
int f[maxn];
int main(){
int i, j, n;
while (scanf_s("%d", &n)){
memset(f, 0, sizeof(f));
f[0] = 1;
for (i = 2; i <= n; i++){
//乘以i
int c = 0; //c是进位
for (j = 0; j < maxn; j++){
int s = f[j] * i + c; //s是3000位依次来乘以i且加上进位
f[j] = s % 10; //当前位存储个位
c = s / 10; //进位标识
}
}
for (j = maxn - 1; j >= 0; j--){
if (f[j]) break; //从后往前,依次排除掉数为0的位
}
//输出结果
for (i = j; i >= 0; i--)
printf("%d", f[i]);
printf("n");
}
system("pause");
return 0;
}
5.2.3 高精度运算类bign
5.2.4 重载bign的常用运算符
5.3.1 6174问题
#include<iostream>
using namespace std;
int cmp(int a,int b)
{
return a>b?a:b;
}
int main()
{
int a,flag=0,j=0;
int ans[1000];
while(!flag)
{
int a=sort(a,a+4,cmp);
int b=sort(a,a+4);
int c=a-b;
ans[j++]=c;
for(int i=0;i<j;i++)
{
if(ans[i]==c) flag=1;
}
}
for(int i=0;i<j;i++)
{
cout<<ans[i]<<"->";
if(i==j-1) cout<<ans[i];
}
return 0;
}
5.3.2字母重排
5.4.1 Cantor的数表
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int k=0,s=0;
for(int i=1;n<=s;i++)
{
s+=i;
k++;
}
cout<<k-(s-n)<<"/"<<s-n+1;
return 0;
}
5.4.2因子和阶乘
5.4.3果园里的树
#include<bits/stdc++.h>
double area2(double x0,double y0,double x1,double y1,double x2,double y2)
{
return x0*y1+x2*y0+x1*y2-x2*y1-x0*y2-x1*y0;
}
int main()
{
int count=0,x,y;
double a_x,a_y,b_x,b_y,c_x,c_y;
cin>>a_x>>a_y>>b_x>>b_y>>c_x>>c_y;
for(int i=1;i<100;i++)
for(int j=1;j<100;j++)
{
x=i;
y=j;
double s1,s2,s3;
s1=fabs(area2(a_x,a_y,b_x,b_y,x,y)); //三角形面积公式,三角形任意点内连接三边的点,将三角形分成三部分,则该点也必然在三角形内
s2=fabs(area2(a_x,a_y,x,y,c_x,c_y));
s3=fabs(areas(x,y,b_x,b_y,c_x,c_y));
double s=fabs(area2(a_x,a_y,b_x,b_y,c_x,c_y));
if(fabs(s-s1-s2-s3)<=1e-9)count++; //浮点数精度不准==无法判断
}
cout<<count;
return 0;
}
5.4.4 多少块土地
#include<iostream>
using namespace std;
int main()
{
int V,E,F,a,b,n;
a=b=0;
cin>>n;
for(int i=0;i<=n-2;i++)
{
a+=i*(n-2-i);
b=a+1;
}
V=n+n*a/4;
E=n+n*b/2;
F=E-V+1; //欧拉公式V-E+F=2,得到F=E-V+2,还要减去椭圆外那个无穷大的面
cout<<F;
return 0;
}
6.1.1卡片游戏
#include<iostream>
#include<queue>
using namespace std;
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++) q.push(i+1);
while(q.empty())
{
cout<<q.front(); //输出栈顶
q.pop(); //删除此栈顶
q.push(q.front()); ///将新栈顶压入站尾
q.pop(); //并且抛弃这个新栈顶
}
return 0;
}
6.1.2 铁轨
#include<iostream>
using namespace std;
int main()
{
int a[1010];
int n;
while((cin>>n)&&n)
{
while(cin>>a[1]&&a[1])
{
for(int i=2;i<=n;i++)
{
cin>>a[i];
}
stack<int>s2;
int j=1;
for(int i=1;i<=n;i++)
{
s2.push(i);
while(!s2.empty()&&(s2.top()==a[j]))
{
j++;
s2.pop();
}
}
cout<<((s2.empty()&&(j==n+1))?"Yesn":"Non");
}
cout<<"n";
}
return 0;
}
最后
以上就是个性盼望为你收集整理的c/c++算法竞赛入门经典第一版刘汝佳第五,六章课后习题的全部内容,希望文章能够帮你解决c/c++算法竞赛入门经典第一版刘汝佳第五,六章课后习题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复