@pandaoxi2022
2022-08-02T20:33:18.000000Z
字数 13298
阅读 585
字符数组
1、什么是字符数组
用来存放字符的数组就是字符数组,字符数组的每一个元素用来存放一个字符。
str[0]=’h’;str[1]=’e’;str[2]=’l’,str[3]=’l’,str[4]=’o’;
2、字符数组的初始化
如果在定义数组时不进行数组初始化,则数组中各元素的值是不可预料的,如果花括号的内容大于数组长度,则会出现语法错误,如果小于,后面的元素就自动被定义为空字符(即\0)。
char a[6]={‘w’,’o’,’r’,’l’,’d’};//长度为6
char str[]={‘w’,’o’,’r’,’l’,’d’};//长度为5,系统自动定义,不需要人工的去数。
这两个字符数组是不等价的,一定要注意区别
3、字符串结束标志
C语言中是将字符串当作字符数组来表示的,人们往往关心字符串的实际长度而非字符数组的长度,若在一个字符数组中前面9个元素 都不是空字符,第十个元素是空字符(\0),那就说明这个数组的有效长度是9。c系统会在存储字符串的时候加一个\0。
说明:‘\0’是ASCII码为0的字符,是一个不可显示的字符,是一个空操作符,什么也不做,只是一个结束标志,所以我们常使用字符串常量对字符数组进行初始化,例如:
char str[]={“happy ending”}
也可以直接省略花括号,写为:
char str=”happy ending”
注意:字符数组并不会要求最后一个数组元素为’\0’,甚至可以不包含\0。
4、字符数组不能直接比较
#include<bits/stdc++.h>
using namespace std;
int main() {
char s1[10] = "hello";
char s2[10] = "hello";
if(s1 == s2) cout<<"相同";
else cout<<"不相同";
char s3[10];
//s3 = s1;赋值错误
cout<<s1<<endl;
cout<<s2<<endl;
if(strcmp(s1,s2)>0){
cout<<s1<<"字典码大于"<<s2<<endl;
}else if(strcmp(s1,s2)<0){
cout<<s1<<"字典码小于"<<s2<<endl;
}else{
cout<<s1<<"字典码等于"<<s2<<endl;
}
int a[10]={1,2,3,4,5};
cout<<a<<endl;
cout<<&a<<endl;
cout<<&a[0]<<endl;
return 0;
}
5、字符数组相关函数
strlen(s) 求字符串长度
strcmp(s1,s2) 字符串比较,按照字典码顺序比较大小,如果s1大返回整数,相等0,如果s2大返回负数
"123"<"3"
"hello" < "hi"
"good"<"goodstudent"
strncmp(s1,s2,n) 把s1,s2的前n个数比较
strcat(s1,s2) 将s2连接到s1后面
strncat(s1,s2,n)将s2的前n个字符连接到s1的后面
strcpy(s1,s2)将s2的内容拷贝给s1,替换s1的内容
strncpy(s1,s2,n)将s2的前n个字符拷贝给s1,替换s1的内容
字符处理相关函数
int isalnum(int c):检查字符是否为数字或字母;(0~9,a~z,A~Z)
int isalpha(int c):检查字符是否为字母;(a~z, A~Z)
int iscntrl(int c):检查字符是否为控制字符;(八进制000~037以及177的字符)
int isdigit(int c):检查字符是否为十进制数字;(0~9)
int isgraph(int c):检查字符是否为图形表示,依赖于使用语言的环境;0~9,a~z,A~Z,以及标点符号)
int islower(int c):检查字符是否为小写的字母;(a~z)
int isprint(int c):检查字符是否为可打印的;(数字、字母、标点符号、空白字符)
int ispunct(int c):检查字符是否为标点符号;(! ” # $ % & ’ ( ) * + , - . / : ; < = > ? @ [ ] ^ _ ` { | } ~等)
int isspace(int c):检查字符是否为空白字符;(TAB、换行、垂直TAB、换页、回车、空格)
int isupper(int c):检查字符是否为大写字母;(A~Z)
int isxdigit(int c):检查字符是否为十六进制数字;(0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f)
int tolower(int c):转化字符为小写字母;
int toupper(int c):转化字符为大写字母;
```c++
<div class="md-section-divider"></div>
#include<bits/stdc++.h>
using namespace std;
int main(){
char a[10];
a[0] = 'h';
a[1] = 'i';
a[2] = '\0';
//1.由于字符数组以\0结尾,所以可以直接cout,整数数组不能直接输入输出
cout<<a<<endl;
//sizeof():计算变量占用的字节数
//srlen():计算字符数组在\0之前的字符数量(string length)
cout<<sizeof(a)<<" "<<strlen(a)<<endl;
//2.如果采用{}的形式赋值,且个数不足数组长度,则剩余的值默认补充'\0'
char b[10] = {'h','i','\0'};
cout<<sizeof(b)<<" "<<strlen(b)<<endl;
//3.由内容确定字符数组长度
char c[]= {'h','i','\0'};
cout<<sizeof(c)<<" "<<strlen(c)<<endl;
//4.直接使用字符串赋值 ,默认添加一个'\0'
char d[]="hi";
cout<<sizeof(d)<<" "<<strlen(d)<<endl;
//例子
char e[] = {'h','i','\0','t','o','m'};
cout<<sizeof(e)<<" "<<strlen(e)<<endl;
return 0;
}
<div class="md-section-divider"></div>
}
<div class="md-section-divider"></div>
using namespace std;
int main(){
//输入输出字符串的方法
char s[100];
//cin以空格作为结束
// cin>>s;
字符串输入:
//string x; scanf("%s",x);//不读取空格,不读取回车
//gets(x);//读取空格,读取回车
//cin>>x;//不读取空格, 不读取回车
//getline(cin,x);//读取空格,不读取回车
//字符输入
//char ch;
//cin>>x;//不读取回车
//scanf("%c",&ch);//读取回车
//gets以回车为结束
gets(s);
cout<<s<<endl;
//遍历并输出
for(int i = 0; i < strlen(s); i++){
cout<<s[i]<<endl;
}
for(int i = 0; i != '\0'; i++){
cout<<s[i]<<endl;
}
return 0;
}
}
<div class="md-section-divider"></div>
/*1097 - 【入门】统计字符的个数
题目描述
从键盘中任意输入一串字符,直至输入"#"字符代表结束。请编程统计输入的字符中的大写字母,小写字母和数字字符的个数分别是多少?
输入
输入只有一行,包括一串字符。(长度小于20,且没有空格)
输出
输出只有一行,包括3个整数。分别代表大写字符,小写字符和数字字符的个数。
样例
输入复制
daDSALDdcada3240#
输出复制
5 7 4
*/
<div class="md-section-divider"></div>
#include<bits/stdc++.h>
using namespace std;
int main(){
char s[30];
int d=0,x=0,n=0;
//cin以空格作为结束
//gets以回车为结束
gets(s);
cout<<s<<endl;
//遍历
for(int i = 0; i < strlen(s); i++){
if(s[i]>='A' && s[i]<='Z'){
d++;
}else if(s[i]>='a' && s[i]<='z'){
x++;
}else if(s[i]>='0' && s[i]<='9'){
n++;
}
}
cout<<d<<" "<<x<<" "<<n;
return 0;
}
<div class="md-section-divider"></div>
}
<div class="md-section-divider"></div>
/*1115 - 【入门】数字和
题目描述
输入一个很大的数,求各位上的数字和。
输入
一个很大的整数(不超过200位)
输出
一个整数
样例
输入复制
123
输出复制
6
6
*/
using namespace std;
int main(){
char a[210];
int s=0;
cin>>a;
//遍历
for(int i = 0; i < strlen(a); i++){
//将字符转换为真实的数,‘0’的asc码为48
s += a[i] - '0';
}
cout<<s;
return 0;
}
}
<div class="md-section-divider"></div>
/*1116 - 【入门】调换位置
题目描述
将用逗号隔开的两个英语单词交换位置输出。
输入
一行以逗号隔开的两个英文单词。(字符串长度不超过100)
输出
将两个单词交换后输出的结果
样例
输入复制
abc,de
输出复制
de,abc
*/
<div class="md-section-divider"></div>
#include<bits/stdc++.h>
using namespace std;
int main(){
char a[200],b[200];
int s=0;
gets(a);
//遍历
for(int i = 0; i < strlen(a); i++){
//找到逗号位置,赋值给s
if(a[i] == ','){
s = i;
}
}
int bp=0;
for(int i = s+1; i < strlen(a); i++){
//从逗号之后开始,复制所有字符串到新数组
b[bp] = a[i];
bp++;
}
//添加逗号
b[bp] = ',';
bp++;
for(int i = 0; i < s; i++){
//把逗号前面的内容复制过来
b[bp] = a[i];
bp++;
}
//添加结束‘\0’
b[bp] = '\0';
cout<<b;
return 0;
}
<div class="md-section-divider"></div>
}
<div class="md-section-divider"></div>
/*1098 - 【入门】判断是否构成回文
题目描述
输入一串字符,字符个数不超过100,且以"."结束。 判断它们是否构成回文。
输入
输入只有一行,包括一串字符。(测试数据不含空格)
输出
输出只有一行,TRUE 或者FALSE 。
样例
输入复制
12321.
输出复制
TRUE
*/
using namespace std;
int main(){
char a[200];
bool s=true;
gets(a);
//遍历
for(int i = 0; i < (strlen(a)-1)/2; i++){
if(a[i] != a[strlen(a)-2-i]) {//如果有任何一个不等,则不是回文
s=false;
break;//退出循环
}
}
if(s) cout<<"TRUE";
else cout<<"FALSE";
return 0;
}
}
<div class="md-section-divider"></div>
/*1177 - 【入门】统计字母出现次数
题目描述
输入一串小写字母(以"."为结束标志),统计出每个字母在该字符串中出现的次数(若某字母不出现,则不要输出,题目保证每个字母出现的次数<10)。
输入
输入只有一行,包括若干个字符。
输出
输出只有两行,第一行为出现的小写字母,第二行为字母的出现次数。
样例
输入复制
abdceeef.
输出复制
abcdef
111131
*/
<div class="md-section-divider"></div>
#include<bits/stdc++.h>
using namespace std;
int main(){
char a[1000];
int sum[200]={0};//存放每个字母出现的次数
gets(a);
//遍历
for(int i = 0; i < strlen(a); i++){
int c = a[i];//得到字母对应的asc码
sum[c]++;
}
//输出那些字母出现过
for(int i=97; i<97+25; i++){
if(sum[i] !=0) cout<<(char)i;
}
cout<<endl;
//输出字母的出现次数
for(int i=97; i<97+25; i++){
if(sum[i] !=0) cout<<sum[i];
}
return 0;
}
<div class="md-section-divider"></div>
}
<div class="md-section-divider"></div>
/*1134 - 【基础】国王的魔镜
题目描述
国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——
只是,因为是镜子嘛,增加的那部分是反的。
比如一条项链,我们用AB来表示,不同的字母表示不同颜色的珍珠。
如果把B端接触镜面的话,魔镜会把这条项链变为ABBA。
如果再用一端接触的话,则会变成ABBAABBA(假定国王只用项链的某一端接触魔镜)。
给定最终的项链,请编写程序输出国王没使用魔镜之前,最初的项链可能的最小长度。
输入
只有一个字符串,由大写英文字母组成,表示最终的项链。
输出
只有一个整数,表示国王没使用魔镜前,最初的项链可能的最小长度。
样例
输入复制
ABBAABBA
输出复制
2
2
*/
using namespace std;
bool f(char s[] ){
bool r=true;
for(int i = 0; i < (strlen(s))/2; i++){
if(s[i] != s[strlen(s)-1-i]) {//如果有任何一个不等,则不是回文
r=false;
break;//退出循环
}
}
return r;
}
int main(){
char a[1000];
gets(a);
// if(f(a)) cout<<1;
// else cout<<0;
while(f(a) && (strlen(a) % 2 == 0)){
a[strlen(a)/2] = '\0';
}
cout << strlen(a);
return 0;
}
}
<div class="md-section-divider"></div>
/*
1100 - 【入门】词组缩写
题目描述
定义:一个词组中每个单词的首字母的大写组合称为该词组的缩写。 比如,C语言里常用的EOF就是end of file的缩写。
输入
测试数据占一行,有一个词组,每个词组由一个或多个单词组成;每组的单词个数不超过10个,每个单词有一个或多个大写或小写字母组成; 单词长度不超过10,由一个或多个空格分隔这些单词。
输出
输出规定的缩写
样例
输入复制
end of file
输出复制
EOF
*/
<div class="md-section-divider"></div>
#include<bits/stdc++.h>
using namespace std;
char up(char c){
if(c>='a' && c<='z'){
c= c-('a'-'A');
}
}
}
int main() {
/*
第一步:获得每个单词的首字母
空格后面的字母是首字母。当前不是空格,上一个是空格
第一个字符不是空格就是首字母
第二步:判断如果是小写,转换为大写输出,否则直接输出
*/
char s[100];
gets(s);
for(int i = 0;i<strlen(s);i++){
if(i==0 && s[i]!=' '){
cout<<up(s[i]);
}else if((i!=0) &&(s[i]!=' ' && s[i-1]==' ')){
cout<<up(s[i]);
}
}
return 0;
}
<div class="md-section-divider"></div>
}
<div class="md-section-divider"></div>
/*
1103 - 【基础】字符串压缩
题目描述
输入字符串,输出压缩后的字符串。压缩的方法是把连续的相同字母压缩为"长度+字母"的形式,在本题中,单个的字母不需要压缩。
输入
一行,一个字符串,只包含小写英文字母,长度不超过255。
输出
样例
输入复制
aaabbbbbx
输出复制
3a5bx
*/
using namespace std;
int main() {
/*
统计连续相同字符的个数
数数法:准备个计数变量。开始数,如果是相等的话,计数器加一,如果不相等,则计数器清零
*/
char s[100];
int sum=0;
gets(s);
for(int i = 0;i<strlen(s);i++){
sum++;//先加上,如果不等,则清空,不影响结果。如果不加则需要在else中自增
if(s[i]!=s[i+1]){
if(sum>1) cout<<sum;
cout<<s[i];
sum=0;
}
}
return 0;
}
}
<div class="md-section-divider"></div>
/*
1107 - 【基础】求英文句子中的最长单词
题目描述
一个英文句子(长度不超过255),只含有字母和空格,输出最长的一个单词。如有多个长度相同的单词,则输出最前面的一个。
输入
一个字符串。
输出
一个字符串。
样例
输入复制
in which four coins
输出复制
which
*/
<div class="md-section-divider"></div>
#include<bits/stdc++.h>
using namespace std;
int main(){
/*
1.分解并输出每个单词
找到字符串结束位置,当前字符不是空格,下一个字符是空格或者'\0'
2.找到最长单词
*/
char s[300],w[100],r[100]={'\0'};//字符数组默认填充'\0'
int k=0;
gets(s);
for(int i=0;i<strlen(s);i++){
if(s[i]!=' '){
w[k] = s[i];
k++;
if(s[i+1]==' ' ||s[i+1]=='\0'){
w[k]='\0';
if(strlen(w) > strlen(r)){
strcpy(r,w);
}
//清空w数组
k=0;
}
}
}
cout<<r;
return 0;
}
<div class="md-section-divider"></div>
}
<div class="md-section-divider"></div>
/*
1012 - 【基础】我是第几个单词
题目描述
输入一个英文句子,例如:“This is a Book.",可以看到句子是以“.”来作为结束符号的,并且单词之间以一个空格来分隔。接着再输入一个单词A,请找出首次在句子中出现的与A相同的单词,是句子中的第几个单词,若不存在,则输出该句子中单词字符的总个数。 例如对上句子而言,若输入单词“is”,则应输出:2 若输入单词“isa”,则应输出:11
输入
第一行为以‘.’结束的一个词组(仅由若干个单词组成,单词间由一空格隔开,除单词和最后的“.”以外,不含其它字符)
第二行是一个单词(不含空格)
输出
一个整数
样例
输入复制
This is a Book.
Book
输出复制
4
4
*/
using namespace std;
int main(){
/*
1.分解并输出每个单词,并且统计每个是第几个
2.判断每个单词是不是要找的,如果是,输出第几个
3.如果没有找到,则输出字符总数
*/
char s[300],w[100],f[100];//s总单词,f为要找的单词
int k=0,count=0;//w当前位置
bool flag=false;
gets(s);
gets(f);
for(int i=0;i<strlen(s);i++){
//如果当前字符不是空格,也不是.则说明是单词的一部分
if(s[i]!=' ' && s[i]!='.'){
w[k] = s[i];
k++;
//判断连续的单词是否结束
if(s[i+1]==' ' || s[i+1]=='.'){
w[k]='\0';
count++;
if(strcmp(w,f)==0){
cout<<count;
flag = true;
break;
}
//清空w数组
k=0;
}
}
}
if(!flag) cout<<count;
return 0;
}
}
<div class="md-section-divider"></div>
/*
1130 - 【入门】简单a+b
题目描述
张晓菲同学做了简单的ab求和的问题。但是,如果要求输入的情况不是a和b,而是整个加法表达式呢? 请想办法,计算加法表达式的结果。
输入
输入一个加法表达式,如1+2=,或者23+58=。(注意:做加法的2个整数都在0~109的范围内)
输出
计算出输入表达式的正确结果
样例
输入复制
1+2=
输出复制
3
3
*/
<div class="md-section-divider"></div>
#include<bits/stdc++.h>
using namespace std;
int convert(char a[]){
int n=0,pow=1;//pow代表乘以的位数乘方计算的值
for(int i=strlen(a)-1;i>=0;i--){
n += (a[i] - '0') * pow;
pow*=10;
}
return n;
}
}
int main(){
/*
1.分解并输出每个整数
2.将字符数组存储的整数转换为实际的整数
3.求和
*/
char s[300],n1[100]={'\0'},n2[100]={'\0'};
bool flag=false;
gets(s);
int i=0;
while(s[i]!='+'){
n1[i] = s[i];
i++;
}
i++;
int p = i;
while(s[i]!='='){
n2[i-p] = s[i];
i++;
}
//cout<<n1<<" "<<n2;
cout<<convert(n1)+convert(n2);
return 0;
}
<div class="md-section-divider"></div>
作业:
}
作业:
<div class="md-section-divider"></div>
/*
1106 - 【入门】统计单词个数
题目描述
输入一行字符串(字符串长度≤100),包含若干个单词,约定相邻的两个单词用空格隔开(一个或多个空格),编程统计单词的个数。
输入
一行空格隔开的若干个单词。
输出
单词个数
样例
输入复制
Hello World
输出复制
2
2
*/
using namespace std;
int main(){
/*
*/
char s[300];
int n=0;
gets(s);
for(int i=0;i<strlen(s);i++){
if(s[i]!=' '&&(s[i+1]==' ' ||s[i+1]=='\0')){
n++;
}
}
cout<<n;
return 0;
}
}
<div class="md-section-divider"></div>
/*
1111 - 【基础】找最长单词
题目描述
编写程序,根据给出的一个结束于'.'的字符字串,找出其中最长的含有字母'a'的子串。
输入
一行,为一个字符字串,结束于句点'.'。字串中的子串由一个或几个空格隔开。
输出
一行。显示找出的最长的含有字母'a'的子串。如果有多个这样的子串,只显示其中的第一个;若没有含字母'a'的子串,则显示'NO'。
样例
输入复制
Her name is Lilan and she is a happy student.
输出复制
Lilan
*/
<div class="md-section-divider"></div>
#include<bits/stdc++.h>
using namespace std;
int main(){
/*
1.分解并输出每个单词
找到字符串结束位置,当前字符不是空格,下一个字符是空格或者'.'
2.找到最长单词
*/
char s[1000],w[100],r[100]={'\0'};//字符数组默认填充'\0'
int k=0;
bool a=false;
gets(s);
for(int i=0;i<strlen(s);i++){
if(s[i]!=' '){
if(!a && s[i] == 'a'){
a=true;
}
w[k] = s[i];
k++;
if(s[i+1]==' ' || s[i+1]=='.'){
w[k]='\0';
if((strlen(w) > strlen(r) ) && a){
//cout<<w<<endl;
strcpy(r,w);
}
//清空w数组
k=0;
a=false;
}
}
}
if(strlen(r)>1){
cout<<r;
}else{
cout<<"NO";
}
return 0;
}
<div class="md-section-divider"></div>
}
<div class="md-section-divider"></div>
/*
1129 - 【入门】简单a*b
题目描述
按照a*b = 的格式输入算式,通过计算输出a*b的结果。
输入
输入中包括一个表达式,如:a*b=,a和b都是int类型的正整数。
输出
结果只有一个正整数,整数在long long范围内。
样例
输入复制
100*200=
输出复制
20000
*/
using namespace std;
int convert(char a[]){
int n=0,pow=1;//pow代表乘以的位数乘方计算的值
for(int i=strlen(a)-1;i>=0;i--){
n += (a[i] - '0') * pow;
pow*=10;
}
return n;
}
}
int main(){
/*
1.分解并输出每个整数
2.将字符数组存储的整数转换为实际的整数
3.求和
*/
char s[300],n1[100]={'\0'},n2[100]={'\0'};
bool flag=false;
gets(s);
int i=0;
while(s[i]!='*'){
n1[i] = s[i];
i++;
}
i++;
int p = i;
while(s[i]!='='){
n2[i-p] = s[i];
i++;
}
//cout<<n1<<" "<<n2;
cout<<(long long)convert(n1)*convert(n2);
return 0;
}
}
<div class="md-section-divider"></div>
/*
1408 - 【入门】合法的变量名?
题目描述
James在一节C++课程上,准备为自己的程序定义变量名称。老师告诉James,一个合法的变量名应该满足如下的三个条件:
1、只能由字母(大写或者小写)、数字及下划线(_)组成
2、不能以数字开头
3、不能是C++中有特殊含义的单词,由于James是C++的初学者,只学过int、double、cout、cin这四个有特殊含义的单词,因此James只要避开这几个单词就可以。
请你编程帮助James判断他定义的变量名是否合法。
下表中列举了一些合法的变量名和非法的变量名的案例供你参考。
合法变量名案例
x
sum
sum_x
sum2
_sum
x
sum
sum_x
sum2
_sum
INT注意:这是合法的,因为在C++中是区分大小写的,int是表示整数类型,但INT不是);
非法变量名案例
sum x:有空格(只能是字母、数字或下划线)
1x:以数字开头
int:有特殊含义
a#:有特殊字符“#”(只能是字母、数字、下划线)。
输入
一行,包含一个字符串,是James为变量起的名字,且长度不大于20。
输出
一行,如果是合法的C++变量名,则输出yes,否则输出no。
样例
输入复制
sum
输出复制
yes
输入复制
sum x
输出复制
no
*/
<div class="md-section-divider"></div>
#include<bits/stdc++.h>
using namespace std;
int main(){
/*
1.分解并输出每个整数
2.将字符数组存储的整数转换为实际的整数
3.求和
*/
char s[300];
bool flag=true;
gets(s);
if(strcmp(s,"int")==0 || strcmp(s,"double")==0 ||strcmp(s,"cout")==0 ||strcmp(s,"cin")==0 ) {
flag = false;
}else if(isdigit(s[0])){
flag = false;
}else
{
for(int i=0;i<strlen(s);i++){
if(!(isdigit(s[i]) || isalpha(s[i]) ||s[i]=='_')){
flag = false;
}
}
}
if(flag){
cout<<"yes";
}else{
cout<<"no";
}
return 0;
}
<div class="md-section-divider"></div>
}
<div class="md-section-divider"></div>
/*
1117 - 【基础】重新排列
题目描述
现在有一个18位以内的自然数,你可以将组成这个数的各位数字重新排列,得到一个数值为最小的新数,但新数的位数保持不变。请编程打印出重新排列后的新数。(如:231重新排序后位数不变的最小数是123,而23105重新排序后位数不变的最小数是10235。)
输入
一个整数(位数 <= 18)
输出
重新排列后最小的新数
样例
输入复制
382
输出复制
238
*/
using namespace std;
int main(){
/*
1.分解并输出每个整数
2.将字符数组存储的整数转换为实际的整数
3.求和
*/
char s[100];
bool flag=true;
gets(s);
sort(s,s+strlen(s));
if(s[0] == '0'){
int i = 1;
while(s[i]=='0'){
i++;
}
s[0] = s[i];
s[i] = '0';
}
cout<<s;
return 0;
}
}
<div class="md-section-divider"></div>
/*
1114 - 【基础】趣味填空
题目描述
小华的寒假作业上,有这样一个趣味填空题: 给出用等号连接的两个整数,如“1234=127”。
当然,现在这个等号是不成立的。题目让你在左边的整数中间某个位置插入一个加号,看有没有可能让等号成立。以上面的式子为例,如果写成123+4=127,这就可以了。 请你编写一个程序来解决它。
输入
只有那个不相等的式子。已知,等号两边的整数都不会超过2000000000。
输出
如果存在这样的方案,请输出那个正确的式子。如果不存在解决方案,请输出“Impossible!”(引号中的部分)。
样例
输入复制
1234=127
输出复制
123+4=127
*/
<div class="md-section-divider"></div>
#include<bits/stdc++.h>
using namespace std;
int convert(char a[]){
int result=0,pow=1;
for(int i=strlen(a)-1;i>=0;i--){
result+=(a[i]-'0') * pow;
pow*=10;
}
return result;
}
int main(){
/*
1.字符串分解为两个数
2.将第一个字符串逐位分解成两个数(转整数函数),并求和判断
3.没有成功则输出 Impossible!
*/
char s[100],n[100]={'\0'},r[100]={'\0'};
bool flag =true;
gets(s);
int i=0;
while(s[i]!='='){
n[i]=s[i];
i++;
}
i++;
int p = i;
while(s[i]!='\0'){
r[i-p]=s[i];
i++;
}
//cout<<n<<""<<r<<endl;
//逐字分割字符串
for(int i=0;i<strlen(n)-1;i++){
char n1[100]={'\0'},n2[100]={'\0'};
int j=0;
while(j<=i){
n1[j] = n[j];
j++;
}
int pp = j;
while(j<strlen(n)){
n2[j-pp] = n[j];
j++;
}
if(convert(n1)+convert(n2)==convert(r)){
cout<<n1<<"+"<<n2<<"="<<r<<endl;
flag = true;
}
}
if(!flag){
cout<<"Impossible!";
}
return 0;
}
<div class="md-section-divider"></div>
}
```