本篇为字符数组
除了数,c++中还有一种变量类型叫做:字符。字符及字符数组在高精度运算中很常用(不得不用)。
注:补充上篇。
转义字符:
字符形式 含义 \n 换行 \0 空操作字符 \r 回车 \' 单引号 \" 双引号 \\ 反斜杠 \t 制表符
一·、定义
不用我多说了吧,字符数组即为存储着字符的数组。
#include<bits/stdc++.h>
using namespace std;
//1.
string a;
//2.
char b[1000];
int main(){
//1.
cin>>a;
//2.
cin>>b;
/*
或(仅对于2):
for(int i=0;i<1000;i++){
cin>>b[i];
}
*/
return 0;
}
二、统计字符串长度
#include<bits/stdc++.h>
using namespace std;
int mian(){
int l;
char a[25];
cin>>a;
l=strlen(a);
cout<<l;
return 0;
}
strlen函数会统计输入的字符个数(包括空格)。
三、高精度
在一些题目中,数据的范围超过了 long long ( unsigned long long )的范围,所以要用高精度。
P1001 A+B Problem
时间限制200ms
内存限制128.00MB
题目描述
输入两个整数 a, ba,b,输出它们的和(|a|,|b| \le {10}^9∣a∣,∣b∣≤109)。
注意
- Pascal 使用 integer 会爆掉哦!
- 有负数哦!
- C/C++ 的 main 函数必须是 int 类型,而且 C 最后要 return 0。这不仅对洛谷其他题目有效,而且也是 NOIP/CSP/NOI 比赛的要求!
好吧,同志们,我们就从这一题开始,向着大牛的路进发。
任何一个伟大的思想,都有一个微不足道的开始。
输入格式
两个以空格分开的整数。
输出格式
一个整数。
输入输出样例
输入 #1
20 30
输出 #1
50
常规代码:
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a,b;
cin >> a >> b;
cout << a+b << endl;
return 0;
}
高精加:
#include <bits/stdc++.h>
using namespace std;
int numa[260], numb[260], ans[260], l1, l2, l, cnt2;
char a[260], b[260];
int main(){
scanf("%s", &a);
scanf("%s", &b);
l1=strlen(a);
l2=strlen(b);
for(int i=l1-1; i>=0; --i){
numa[l1-i-1]=a[i]-'0';
}
for(int i=l2-1; i>=0; --i){
numb[cnt2]=b[i]-'0';
cnt2++;
}
l=max(l1, l2);
for(int i=0; i<l; ++i){
ans[i]+=numa[i]+numb[i];
ans[i+1]=ans[i]/10;
ans[i]%=10;
}
if(ans[l]){
l++;
}
for(int i=l-1; i>=0; --i){
printf("%d", ans[i]);
}
return 0;
}
附:
当然,用Python可以直接过(自带高精度)(本人不建议用Python,因为Python慢,占用空间较大)。
Python代码:
s = input().split() print(int(s[0]) + int(s[1]))
或:
a = int(input()) b = int(input()) print(a+b)
1.高精乘:
#include <bits/stdc++.h> using namespace std; int numa[260], numb[260], ans[260], l1, l2, l, cnt2; char a[260], b[260]; int main(){ scanf("%s", &a); scanf("%s", &b); l1=strlen(a); l2=strlen(b); for(int i=l1-1; i>=0; --i){ numa[l1-i-1]=a[i]-'0'; } for(int i=l2-1; i>=0; --i){ numb[cnt2]=b[i]-'0'; cnt2++; } l=max(l1, l2); for(int i=0; i<l1; ++i){ for(int j=0;j<l2;j++){ ans[i]+=(numa[i]*numb[j])*pow(10,j); } ans[i+1]=ans[i]/10; ans[i]%=10; } if(ans[l]){ l++; } for(int i=l-1; i>=0; --i){ printf("%d", ans[i]); } return 0; }
2.高精减:
#include<bits/stdc++.h> using namespace std; char a[20000],b[20000]; int c[20000],d[20000],e[20000]; int l1,l2,p; bool k=0,m=0; int main(){ cin>>a>>b; l1=strlen(a); l2=strlen(b); p=l2; for(int i=0;i<=l1;i++){ c[l1-i]=a[i]-'0'; } for(int i=0;i<=l2;i++){ d[l2-i]=b[i]-'0'; } if(l1>=l2){ p=l1; for(int i=1;i<=p;i++){ swap(c[i],d[i]); } } else{ m=1; } for(int i=1;i<=p;i++){ swap(c[i],d[i]); } for(int i=p;i>=0;i--){ if (c[i]>d[i]){ break; } if(c[i]<d[i]){ k=1; break; } } if(k){ m=1; for(int i=0;i<p;i++){ swap(c[i],d[i]); } } for(int i=0;i<=p;i++){ e[i]+=c[i]-d[i]; if(e[i]<0){ e[i]+=10; e[i+1]-=1; } } k=0; if(m){ cout<<"-"; } for(int i=0;i<p;i++){ if(e[p-i]!=0||i==p-1){ k=1; } if(k){ cout<<e[p-i]; } } return 0; }