强化阶段 Day 6 算法笔记 3.6 字符串处理(3)

目录

1.Scientific Notation

2.数字加密

3.A+B Format 

4.Spell It Right 

5.Password

6.Kuchiguse

7.Read Number in Chinese


1.Scientific Notation

这道题目比较繁琐,第一道程序是我按着算法笔记的题解来写的。

其实需要注意几个点。

首先不要被这个结构吓到了,其实就是科学计数法的表达方式。

其次也不过是按照题目说的来输出,只是小数点和零的个数还有位置需要好好想一下。

#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

int main(){
	
	char str[10006];
	scanf("%s",str);
	
	if(str[0]=='-'){
		printf("-");
	}
	
	int len=strlen(str),pos=0;//pos存放E的位置
	while(str[pos]!='E'){
		pos++;
	}
	
	int exp=0;//存放指数,不考虑正负
	for(int i=pos+2;i<len;i++){
		exp = exp * 10 + (str[i] -'0');
	}
	
	if(exp==0){
		for(int i=1;i<pos;i++){
			printf("%c",str[i]);
		}
	}
	
	if(str[pos+1]=='-'){
		printf("0.");
		for(int i=0;i<exp-1;i++){
			printf("0");
		}
		printf("%c",str[1]);
		for(int i=3;i<pos;i++){
			printf("%c",str[i]);
		}
	}else{
		for(int i=1;i<pos;i++){
			if(str[i]=='.') continue;
			printf("%c",str[i]);
			if(i==exp+2&&pos-1-2!=exp){
				printf(".");
			}
		}
		for(int i=0;i<exp-(pos-3);i++){
			printf("0");
		}
	}

	return 0;
}

这是我自己的解法,注释比较多,可能比较好理解

#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

int main(){
	
	char str[10008];
	scanf("%s",str);
	
	if(str[0]=='-') printf("-");//如果是负数,才需要输出负号
	
	int len=strlen(str);
	
	//找到E的位置
	int pos_e;
	for(int i=1;i<len;i++){
		if(str[i]=='E'){
			pos_e=i;
			break;
		}
	}
	
	//找到指数的大小
	int exp=0;
	for(int i=pos_e+2;i<len;i++){
		exp = exp*10+(str[i]-'0');
	}
	
	//分为正指数和负指数来讨论
	if(str[pos_e+1]=='-'){//负指数 
		printf("0.");//负指数一定是以0.开头的
		for(int i=0;i<exp-1;i++){//根据负指数输出exp-1个零 
			printf("0");
		}
		printf("%c",str[1]);//输出科学计数法中的整数部分 
		for(int i=3;i<pos_e;i++){//输出科学计数法的小数部分 
			printf("%c",str[i]);
		}
	}else{//正指数
		int dot = 2+exp;//原来小数点在数组的2号位,现在在2+exp处 
		int int_end = pos_e-1;//正好为整数时,最后面不需要小数点,所以要求出这个位置在后面进行判断 
		for(int i=1;i<pos_e;i++){
			if(str[i]!='.') printf("%c",str[i]);		
			if(i==dot&&i!=int_end){
				printf(".");
			}
		}
		int nums =  exp - (pos_e - 3);//如果指数比较大,需要补充的0的数目 
		for(int i=0;i<nums;i++){
			printf("0");
		}
	}
	return 0;
}

2.数字加密

有两个点无法通过

#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

int main(){
	
	char martix[15] = {'0','1','2','3','4','5','6','7','8','9','J','Q','K'};
	char a[104],b[104];
	char ans[104];
	scanf("%s %s",a,b);
	int len1=strlen(a);
	int len2=strlen(b);
	
	int length=0;
	int x,y;
	int i,j;
	for(i=len1-1,j=len2-1;length<len1&&length<len2;length++,i--,j--){
		x = a[i]-'0';
		y = b[j]-'0';
		if(length%2==0){
			ans[length] = martix[(x+y)%13];
		}else{
			if(y-x<0) y+=10;
			ans[length] = martix[y-x];
		}
	}
	
	if(len1<len2){
		for(length;length<len2;length++){
			ans[length] = b[j--];
		}
	}else{
		for(length;length<len1;length++){
			ans[length] = a[i--];
		}
	}
	
	length-=1;
	for(length;length>=0;length--){
		printf("%c",ans[length]);
	}
	
	return 0;
}

配套书里的做法:

首先可以把这两个字符数组翻转一下(这里并不会有进位),这样会比较方便。否则因为不知道长短而不好比较。

其次对于位数比较多的数组,可以把另一个数组缺少的位数看做0。

3.A+B Format 

不能从后往前计数输出,这样会导致最后一段不对。

直接根据数组的坐标来,数组的坐标为3时,说明后面还有三个待输出,为6时也是这样。

#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

int main(){
	
	int x,y;
	scanf("%d%d",&x,&y);
	int ans=x+y;
	if(ans<0){
		printf("-");
		ans*=-1;
	}
	
	int martix[10];
	int num=0;
	if(ans==0) martix[num++] = 0;//和为0时单独考虑 
	while(ans){
		martix[num++] = ans%10;
		ans/=10;
	}
	
	for(int k=num-1;k>=0;k--){
		printf("%d",martix[k]);
		if(k>0&&k%3==0) printf(",");
	}
	
	return 0;
}

4.Spell It Right 

 

#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

int main(){
	
	char martix[12][6] = {"zero","one","two","three","four","five","six","seven","eight","nine"};
	char str[105];
	scanf("%s",str);
	int sums=0;
	for(int i=0;i<strlen(str);i++){
		sums+=str[i]-'0';
	}
	int ans[100]={0},num=0;
	if(sums==0) ans[num++] = 0;
	while(sums){
		ans[num++]=sums%10;
		sums/=10;
	}
	for(int i=num-1;i>=0;i--){
		printf("%s",martix[ans[i]]);
		if(i!=0) printf(" ");
	}
	
	return 0;
}

5.Password

用结构体存储账号密码和是否修改过,再通过地址作为参数传入函数,使得可以在函数中对count和martix进行修改

#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

struct node{
	char name[12],password[12];
	bool ischange=false;
}martix[1002];

void search(node& a,int& b){
	int len=strlen(a.password);
	for(int i=0;i<len;i++){
		if(a.password[i]=='1'){
			a.password[i]='@';
			a.ischange=true;
		}
		if(a.password[i]=='0'){
			a.password[i]='%';
			a.ischange=true;
		}
		if(a.password[i]=='l'){
			a.password[i]='L';
			a.ischange=true;
		}
		if(a.password[i]=='O'){
			a.password[i]='o';
			a.ischange=true;
		}
	}
	if(a.ischange){
		b++;
	}
}

int main(){
	
	int n;
	scanf("%d",&n);
	int count=0;
	for(int i=0;i<n;i++){
		scanf("%s %s",&martix[i].name,&martix[i].password);
		getchar();
		search(martix[i],count);
	}
	
	if(count==0){
		if(n==1){
			printf("There is 1 account and no account is modified");
		}else{
			printf("There are %d accounts and no account is modified",n);
		}
	}else{
		printf("%d\n",count);
		for(int i=0;i<n;i++){
			if(martix[i].ischange){
				printf("%s %s\n",martix[i].name,martix[i].password);
			}
		}
	}
	return 0;
}

6.Kuchiguse

注意在给n赋值之后要用getchar();

#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

char martix[102][258];
int length=-1;
int n;

void reverse(int n){
	for(int i=0;i<n;i++){
		int len = strlen(martix[i])-1;
		if(len>length) length=len;
		for(int j=0;j<len/2;j++){
			char temp=martix[i][j];
			martix[i][j] = martix[i][len-1-j];
			martix[i][len-1-j] = temp;
		}
	}
}

bool issame(int q){
	for(int i=0;i<n-1;i++){
		if(martix[i][q]!=martix[i+1][q]){
			return false;
		}
	}
	return true;
}

int main(){
	
	scanf("%d",&n);
	getchar();
	
	for(int i=0;i<n;i++){
		fgets(martix[i],258,stdin);
	}
	reverse(n);
	int num=0;
	char ans[258];
	for(num;num<length;num++){
		if(!issame(num)){
			break;
		}
	}
	if(num==0) printf("nai");
	else{
		for(int i=num-1;i>=0;i--){
			printf("%c",martix[1][i]);
		}
	}
	
	return 0;
}

7.Read Number in Chinese

#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

char num[10][5] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
char wei[5][5] = {"Shi","Bai","Qian","Wan","Yi"};

int main(){
	
	char str[5];
	scanf("%s",str);
	int len=strlen(str);
	int left=0,right=len-1;
	if(str[0]=='-'){
		printf("Fu");
		left++;
	}
	while(left+4<=right){
		right-=4;
	}
	while(left<len){
		bool flag=false;
		bool isprint=false;
		while(left<=right){
			if(left>0&&str[left]=='0'){
				flag=true;
			}else{
				if(flag==true){
					printf(" ling");
					flag=true;
				}
				if(left>0) printf(" ");
				printf("%s",num[str[left]-'0']);
				isprint=true;
				if(left!=right){
					printf(" %s",wei[right-left-1]);
				}
			}
			left++;
		}
		if(isprint==true&&right!=len-1){
			printf(" %s",wei[(len-1-right)/4+2]);
		}
		right+=4;
	}
	
	return 0;
}

Guess you like

Origin blog.csdn.net/aixiaoxiao13/article/details/121788769