7-1 h0094. 乒乓球
题目补充:要分差大于两分的时候才能结束比赛
#include<iostream>
using namespace std;
string s;int sum;
int fun(int n){
int fen1=0,fen2=0;
for(int i=1;i<=sum;i++){
if(s[i]==1)fen1++;
else if(s[i]==0)fen2++;
if(fen1>=fen2+2&&fen1>=n){
cout<<fen1<<":"<<fen2<<endl;
fen1=0;
fen2=0;
}
else if(fen1+2<=fen2&&fen2>=n){
cout<<fen1<<":"<<fen2<<endl;
fen1=0;
fen2=0;
}
}
cout<<fen1<<":"<<fen2<<endl;
}
int main(){
for(char i;cin>>i&&i!='E';){
if(i=='W'){
s[++sum]=1;
}
else if(i=='L'){
s[++sum]=0;
}
}
fun(11);
cout<<endl;
fun(21);
return 0;
}
这个是仿照搜到的题解用调用传局数的一个函数的方式写的,
要注意用1表示正、用0表示负的这种方式。
题很简单,注意要求,理清思路。
7-2 高精度加法
#include<iostream>
using namespace std;
int main(){
int c[105];
for(int i=0;i<105;i++){
c[i]=0;
}
string a ,b;
cin>>a>>b;
int al=a.length(),bl=b.length();
if(al<bl)
{
swap(a,b);
swap(al,bl);
}
for(int i=0;i<bl;i++){
c[i]+=a[al-1-i]-'0'+b[bl-1-i]-'0';
if(c[i]>=10){
c[i]-=10;
c[i+1]++;
}
}
for(int i=bl;i<al;i++){
c[i]+=a[al-1-i]-'0';
if(c[i]>=10){
c[i]-=10;
c[i+1]++;
}
}
if(c[al]==1)al++;
for(int i=al-1;i>=0;i--){
cout<<c[i];
}
return 0;
}
因为数太大所以用数组来存数,倒序输入后相加成一个新数组,然后大于9的进一,and输出
记得数组要减一个‘0’;
7-3 高精度求累加和
#include<iostream>
#include<string.h>
using namespace std;
char x[105];
int a[105],b[105], c[205];
int x1;
int main() {
cin >> x;
x1 = strlen(x);
for (int i = 1; i <= x1; i++) {
a[i] = x[x1 - i ] - '0';
b[i] = x[x1 - i ] - '0';
}
b[1]++;
for (int i = 1; i <= x1; i++) {
if (b[i] > 9) {
b[i + 1] += b[i] / 10;
b[i] %= 10;
}
}
for (int i = 1; i <= x1; i++)
for (int j = 1; j <= x1; j++)
c[i + j - 1] += a[i] * b[j];
int x2 = 2 * x1;
for (int i = 1; i <= x2; i++)
if (c[i] > 9) { c[i + 1] += c[i] / 10; c[i] %= 10; }
for (int i = x2; i > 0; i--) {
c[i - 1] += 10 *(c[i] % 2);
c[i] /= 2;
}
while (c[x2] == 0 && x2 > 1)x2--;
for (int i = x2; i > 0; i--) {
cout << c[i];
}
return 0;
}
带公式~首项加末项乘以项数除以二:x(x+1)/2
所以要用到高精度乘法和除法
方法与上一题一样~
乘法的时候要用循环:第i+j位的数等于第i位和第j+1的数求和