|  | 
 
| 
各位大佬帮忙瞅瞅,才输入完程序就崩溃了!!!
x
马上注册,结交更多好友,享用更多功能^_^您需要 登录 才可以下载或查看,没有账号?立即注册  
 复制代码#include <stdio.h>
#include <string.h>
int isJYZ(int n);      //判断校验是否正确 
void BJT(int UTC);     //将UTC时间换成北京时间 
int main()
{
        char s[127],s1[127],a[127],b[127];
        //scanf("%s\n",&s);
        //strcpy(s1,s);
        int i1,i2 = 0,sum = 0;
        int length1,length2;
        //length1 = sizeof(s);
        length1 = 0;
        do{
                scanf("%s",&s);
                strcat(s1,s);
                length1 += sizeof(s);
        }while(strcmp(s,'END') != 0);
        
        while(1){
                strrchr(a,strrchr(s1,'));
                length2 = sizeof(a);
                sum += length2;
                for( i1=0 ; i1< length2 ; i1++ ){
                        if(i2 < 16){
                                b[i2] = a[i1];
                        }else{
                                if(i1 >= length2-2) b[i2] = a[i1];
                        }
                        
                        if(a[i1] =  ','){
                                i2++;
                        } 
                }
                if(b[2]=='A' && isJYZ(b[16])){
                        BJT(b[1]);
                        break;
                }
                for( i1=0 ; i1<length1-sum ; i1++ ){
                        s1[i1] = s[i1];
                }
        }
        
        return 0;
}
int isJYZ(int n)
{
        int i = 0;   //校验不正确 
        int a,b;
        a = b/10;
        int y = 1;
        while(a < b%10){
                y ^= a;
                a++;
        }
        if(y%65536 == n){
                i = 1;   //校验正确 
        }
        return i; 
}
void BJT(int UTC){
        int a1,a2,b,c;
        a1 = UTC/10000;
        b = UTC%10000/100;
        c = UTC%10000%100;
        if(a1 >= 1 && a1 <= 16){
                a2 = a1 + 8;
        }else{
                a2 = a1 + 8 - 24;
        }
        if(a2 < 10){
                printf("0%d",a2);
        }else{
                printf("%d",a2);
        }
        if(b < 10){
                printf("0%d",b);
        }else{
                printf("%d",b);
        }
        if(c < 10){
                printf("0%d",c);
        }else{
                printf("%d",c);
        }
}
 本帖最后由 超凡天赐 于 2017-5-8 17:15 编辑 
好吧,这一题我已经帮你做出来了,你写的代码我看不懂,   所以我就自己写了一个。 
其实这一题一点也不难,要放到竞赛,真是比送分还送分。就是题目有点长。这么长的题目,我们给它浓缩一下: 
先验证‘$’和‘*’之间的字符累异或后的值(其实和累乘一个道理)是否等于‘*’后的两位数(这个数是16位进制的); 
然后再将第一个逗号后的UCT时间转化为北京时间(其实就是将逗号后的两个数加上8,如果大于24就要剪去24;如果小于10,前面就要补零,比如02)。 
当然了上面的只不过是我们的猜想,还要验证一下。写一个小代码
 复制代码#include <stdio.h>
#include <string.h>
int main()
{
    char a[100];
    scanf("%s",a);
    long length;
    length=strlen(a);
    int i;
    int product=0;
    for(i=0;i<length;i++)
        product^=a[i];
    int result;
    result=product%65536;
    printf("%x",result);
}//GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A
我们输入一下题目中所给的数据
 复制代码GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A
输出的结果为
   对了,好这下我们要用代码来描绘算法了。
 复制代码#include <stdio.h>
#include <string.h>
int verification(char str[])
{
    int a,b;
    int location=0;
    while(str[location]!='*')
    {
        location++;
    }
    if(str[location+1]>='A'&&str[location+1]<='F')
        a=str[location+1]-'A'+10;
    else
        a=str[location+1]-'0';
    if(str[location+2]>='A'&&str[location+2]<='F')
        b=str[location+2]-'A'+10;
    else
        b=str[location+2]-'0';
    int proof_text_value;
    proof_text_value=a*16+b;//proof_text_value转化为10进制数
    int product=0,i;
    for(i=1;i<=location-1;i++)
        product^=str[i];
    product=product%65536;//product为10进制数
    if(product==proof_text_value)
        return 1;
    else
        return 0;
}
void transfer_time(char str[])//只需要对location+1到location+2位数字进行转换
{
    int a,b;
    int location=0;
    while(str[location]!=',')
    {
        location++;
    }
    a=str[location+1]-'0';
    b=str[location+2]-'0';
    int UCT_time,Beijing_time;
    UCT_time=a*10+b;
    Beijing_time=UCT_time+8;
    if(Beijing_time>=24)
        printf("%d:%c%c:%c%c\n",Beijing_time-24,str[location+3],str[location+4],str[location+5],str[location+6]);
    else if(Beijing_time<10)
        printf("0%d:%c%c:%c%c\n",Beijing_time,str[location+3],str[location+4],str[location+5],str[location+6]);
    else
        printf("%d:%c%c:%c%c\n",Beijing_time,str[location+3],str[location+4],str[location+5],str[location+6]);
}
int main()
{
    char a[100][100];
    char b[10]="END";
    int i=0,n;
    do
    {
        scanf("%s",a[i]);
        i++;
    }while(strcmp(a[i-1],b)!=0);
    for(n=0;n<i-1;n++)
        if(verification(a[n])==1)
            transfer_time(a[n]);
    return 0;
}
我们下面要输入数据,老天保佑不要错   复制代码$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50
END
对了对了   
ok,但是我还要提醒你,   ,在竞赛中,那群变态会找一大些数据来测试,一个不通过抠分。超时也会扣分,甚至0分。所以这个代码有可能不会得100   。 
不过这个题目有一点我不明白,那就是我一开始认为这个字符数组长度是固定的。因为好像每一项都是固定的。不过后来我看到他的题目说长度是不固定的。所以一开始我的代码是   复制代码#include <stdio.h>
#include <string.h>
int main()
{
    char a[100];
    scanf("%s",a);
    long length;
    length=strlen(a);
    int i;
    int product=0;
    for(i=0;i<length;i++)
        product^=a[i];
    int result;
    result=product%65536;
    printf("%x",result);
}//GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A
//其实依据你这道题的意思,刚开始时,字符长度已经确定了,为71。
#include <stdio.h>
#include <string.h>
int verification(char str[])
{
    int a,b;
    if(str[69]>='A'&&str[69]<='F')
        a=str[69]-'A'+10;
    else
        a=str[69]-'0';
    if(str[69]>='A'&&str[69]<='F')
        b=str[70]-'A'+10;
    else
        b=str[70]-'0';
    int proof_text_value;
    proof_text_value=a*16+b;//proof_text_value转化为10进制数
    int product=0,i;
    for(i=1;i<=67;i++)
        product^=str[i];
    product=product%65536;//product为10进制数
    if(product==proof_text_value)
        return 1;
    else
        return 0;
}
void transfer_time(char str[])//只需要对7到8位数字进行转换
{
    int a,b;
    a=str[7]-'0';
    b=str[8]-'0';
    int UCT_time,Beijing_time;
    UCT_time=a*10+b;
    Beijing_time=UCT_time+8;
    if(Beijing_time>=24)
        printf("%d:%c%c:%c%c\n",Beijing_time-24,str[9],str[10],str[11],str[12]);
    else if(Beijing_time<10)
        printf("0%d:%c%c:%c%c\n",Beijing_time,str[9],str[10],str[11],str[12]);
    else
        printf("%d:%c%c:%c%c\n",Beijing_time,str[9],str[10],str[11],str[12]);
}
int main()
{
    char a[100][100];
    char b[10]="END";
    int i=0,n;
    do
    {
        scanf("%s",a[i]);
        i++;
    }while(strcmp(a[i-1],b)!=0);
    for(n=0;n<i;n++)
        if(verification(a[n])==1)
            transfer_time(a[n]);
    return 0;
}
有点啰嗦,但我希望你能看完。   | 
 |