• P1553 数字反转(升级版)


    Emma,关于这道题,我。。不想说啥子,也就做了它一个下午左右吧(原由:本人太菜)


    补充一个知识点goto语句:

    这个东西特别的好用,可以直接无条件调到冒号后面的语句,进行操作。

    举个例子:

    #include"bits/stdc++.h"
    using namespace std;
    
    int main() {
    	ios::sync_with_stdio(false);//流输入输出,让cin堪比scanf
    	int a,b,c,d;
    	cin>>a>>b;
    	if(a==b) c=a;
    	else if(a>b) c=b;
    	else goto e;
    	if(c==4) {
    e:
    		for(int i=1; i; i++) {
    			d+=i;
    		}
    	}
    	cout<<c<<d;
    	return 0;
    }
    

    总结一下自己犯得**错误:

    1.(针对数据点2)如测试数据0.0000 没有判断多个0

    2.(针对数据点4)如测试数据0000/2414 当是分数的时候,没有判断前半部分的多个0

    3.(针对数据点5)如测试数据1234567890.0987654321 ' . ' 后半部分翻转后0移到末尾,不应该输出(但我却输出了Q)

    4.(针对数据点6)如测试数据0/10000 输出的正确结果应为0/1,但我的却是0/00001。

    5.(针对数据点20)如测试数据132000.000 输出应该为231.0。我的是231000.0。忘记删去0。


    针对以上**错误,我调了很长时间……嘤。
    

    具体的注意事项在code中有注释(稍微有点长Q):

    #include"bits/stdc++.h"
    using namespace std;
    
    #define N 300
    
    char s[N];
    
    int a[N];//没任何卵用
    
    int cnt=0;//+1
    
    int flag=0;
    
    int main() {
    	cin>>s;
    	int len=strlen(s);//字符串长度
    //特判0
    	if((s[0]=='0' && len==1) /*整数*/) {
    		cout<<0<<"
    ";
    		return 0;
    	}//一个0
    	/*	if((s[0]=='0' && s[1]=='0') ) {//整数
    	        for(int i=0; i<=len-1; i++)
    	            if(s[i]=='0') cnt++;
    	        if(cnt==(len-1))
    	            cout<<0;
    	        return 0;
    	    }//多个0
    	*/
    	cnt=0;
    	if((s[0]=='0' && s[1]=='%')/*百分数*/) {
    		cout<<0<<"%
    ";
    		return 0;
    	}//针对 0%
    	if(s[0]=='0' && s[1]=='0' && len>1) {
    		for(int i=0; i<=len-1; i++) {
    			if(s[i]=='/' || s[i]=='.') {
    				flag=2;
    			}
    		}
    	}//针对类似数据 0000000/2414
    	for(int i=0; i<=len-1; i++) {//判断属于哪种类型
    		if(s[i]=='.'||s[i]=='/')
    			flag=2;//小数,分数
    	}
    	for(int i=0; i<=len-1; i++) {
    		if(s[i]=='%')
    			flag=3;//百分数
    	}
    	if(flag==0) flag=4;//整数
    //	cout<<flag<<'
    ';//手动调试
    	if(flag==4) {//整数
    		cnt=0;//归零
    		memset(a,0,sizeof(a));//清空
    		if(s[len-1]=='0') {//如果翻转后开头是0
    			for(int j=len-2; j>=0; j--) {//从开头接着往前判断直到找到第一个不是0的位置
    				if(s[j]!='0') {
    					for(int i=j; i>=0; i--)
    						cout<<s[i]-'0';
    					return 0;//直接输出,结束
    				}
    			}
    		}
    		if(s[len-1]!='0') { //如果翻转后开头不是0
    			for(int i=len-1; i>=0; i--) cout<<s[i]-'0';
    			return 0;
    		}
    	}
    	if(flag==3) {//百分数
    		cnt=0;
    		memset(a,0,sizeof(a));//
    		if(s[len-2]=='0') {//因为是百分数,所以最后一个肯定是符号%,直接从倒数第二个开始,len-1是倒数第一个
    			for(int i=len-3; i>=0; i--) {
    				if(s[i]!='0') {//跟整数的处理差不多
    					for(int j=i; j>=0; j--)
    						cout<<s[j]-'0';
    					cout<<s[len-1];
    					return 0;
    				}
    			}
    		} else {
    			for(int i=len-2; i>=0; i--)//
    				cout<<s[i]-'0';
    			cout<<s[len-1];
    			return 0;
    		}
    	}
    	int b;
    	int d=-100;//记录位置
    	if(flag==2) {//小数、分数
    		for(int i=0; i<=len-1; i++) {//从头开始找'.'和'/'
    			if(s[i]=='.'||s[i]=='/') {//以它为界限,分成前后两部分
    				b=i;
    				break;//找到就直接退出循环
    			}
    		}
    		if(s[b-1]=='0' && (b-1==0)) {//如果只有一个0
    			cout<<0;
    			goto a;//goto 语句
    		} else if(s[b-1]=='0') {//多个0
    			for(int y=b-1; y>=0; y--) {
    				if(s[y]!='0') {
    					d=y;//记录位置
    					break;
    				}
    			}
    			if(d==(-100)) goto b;//goto语句,针对此类数据134500000.0000
    			for(int y=d; y>=0; y--) cout<<s[y];//输出前半部分
    			goto a;
    		}
    b:
    		if(s[b-1]=='0') {
    			for(int j=b-2; j>=0; j--) {//如果存在多个0
    				if(s[j]=='0')
    					cnt++;
    			}
    			if(cnt==(b-1)) {
    				cout<<0;
    				goto a;
    			}
    		}//再一次针对这种数据 000000000/2414,一个貌似针对不了
    		if(s[b-1]=='0') {//注意翻转后开头是否为0
    			for(int j=b-2; j>=0; j--) {//找第一个不是0的位置
    				if(s[j]!=0)
    					for(int k=j; k>=0; k--)
    						cout<<s[k];
    				break;
    			}
    		} else if(s[b-1]!='0') {//如果开头不是0
    			for(int j=b-1; j>=0; j--)
    				cout<<s[j];
    		}
    a:
    		cout<<s[b];//输出符号
    //找符号界限后面的
    		/*
    		以符号'.'和'/'为界限分成前后两个部分,(因为它们都位于数字中间,所以可以将它们归为一类)
    		*/
    		cnt=0;//归零
    		if(s[len-1]=='0' && (len-1==b+1) ) {//如果只有一个0
    			cout<<0;
    			return 0;
    		} else if(s[len-1]=='0') {//如果存在多个0
    			for(int j=len-2; j>=b+1; j--) {
    				if(s[j]=='0') cnt++;
    			}
    			if(cnt==(len-2-b)) {
    				cout<<0;
    				return 0;
    			}
    		}//针对这种数据 0.000000
    		cnt=0;
    		int w;//记录位置
    		if(s[b+1]=='0') {
    			for(int u=b+2; u<=len-1; u++) {
    				if(s[u]!='0') {
    					w=u;
    					break;
    				}
    			}
    			for(int u=b+1; u<w; u++) {
    				s[u]='';//转换为空字符
    			}
    		}//针对这种数据1234567890.0987654321
    		if(s[len-1]=='0') {//注意翻转后开头是否为0
    			for(int j=len-2; j>=b+1; j--) {
    				if(s[j]!='0') {
    					/*for(int k=j; k>=b+1; k--)
    					if(s[k]=='0' && s[k+1]=='0' && s[k+2]=='0' && s[k+3]=='0' && s[k+4]=='0') {
    					    cout<<" ";
    					    return 0;
    					}
    					if(s[k]=='0') {
    					    for(int l=k; l>=b+1; l--)
    					        if(s[k]=='0') cnt++;
    					    if(cnt==(k-b)) {
    					        s[k]=' ';
    					    }
    					}*/
    					for(int l=j; l>=b+1; l--)
    						cout<<s[l];
    					return 0;
    				}
    			}
    		} else if(s[len-1]!='0') { //若开头不是0
    			for(int x=len-1; x>=b+1; x--)
    				cout<<s[x];
    			return 0;
    		}
    	}
    }
    //DARLING in the FRANXX
    
  • 相关阅读:
    List of Examples Converting XNA 3.1 to XNA 4.0
    XNA程序开发常用到的一些代码汇总
    在WCF中使用Flag Enumerations
    能飞过海洋的却只有海鸥【转载】
    Variant类型转换成CString代码
    一种漂亮的自绘菜单
    转 在OpenCV中用cvCalibrateCamera2进行相机标定(附程序)
    COM组件设计与应用之VC6中用ATL写组件
    vc的菜单,工具栏
    (餐饮)写一些开店的经验转
  • 原文地址:https://www.cnblogs.com/morbidity/p/10822306.html
Copyright © 2020-2023  润新知