#31306: c語言解答


krameri120 (科科)

學校 : 國立臺南高級工業職業學校
編號 : 102318
來源 : [1.173.159.232]
最後登入時間 :
2024-06-06 10:31:47
e189. 3的倍數 - 面試題 -- 트와이스 | From: [106.64.137.183] | 發表日期 : 2022-07-23 12:51

當作大數減法做就好,被除數是3,然後補0
比如513,先補到300,512-300=212,之後再退一位212-30 ,7次
剩下12在減3->4次,檢查first是否是空的或是first[0]=='0',即為3的倍數
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

//================<強制轉成int>=====================
void change_int(char list[]){
    char save_int[20]={'\0'};
    int ok=0;
    int cnt=0;
    for(int x=0;x<strlen(list);x++){
        if(list[x]!='0'){
            ok=1;
        }
        if(ok==1){
            save_int[cnt]=list[x];
            cnt+=1;
        }
    }
    memset(list,'\0',sizeof(char)*20);
    strcpy(list,save_int);
}
//==================<除法翻轉>======================
void div_reverse(char list[]){
    char set[20]={'\0'};
    int cnt=0;
    for(int x=strlen(list)-1;x>=0;x--){
        set[cnt]=list[x];
        cnt+=1;
    }
    memset(list,'\0',sizeof(char)*20);
    strcpy(list,set);
}
//=================<除法的減法>===================
void div_sub(char first[],char change_second[]){
    char sub_result[20]={'\0'};    //減法結果
    div_reverse(first);             //翻轉做減法
    div_reverse(change_second);     //翻轉做減法
    for(int x=0;x<20;x++){
        if(first[x]=='\0' && change_second[x]=='\0'){
            break;                  //減法終止
        }
        else{
            if(first[x]>=change_second[x]){
                if(change_second[x]=='\0'){
                    sub_result[x]=first[x];
                }
                else{
                    sub_result[x]=first[x]-change_second[x]+'0';//被除數第x位夠減除數第x位
                }
            }
            else{
                sub_result[x]=10-change_second[x]+first[x]+'0';//借位
                int cnt=1;
                while(first[x+cnt]=='0'){                   //借位的那位等於0
                    first[x+cnt]+=9;
                    cnt+=1;                                 //多借到第幾位
                }
                first[x+cnt]-=1;
            }
        }
    }
    div_reverse(sub_result);                                //翻轉回來
    change_int(sub_result);                                 //轉成int
    memset(first,'\0',sizeof(char)*20);
    strcpy(first,sub_result);
}
int main(){
    char first[20]={'\0'};
    while(scanf("%s",first)!=EOF){
        char second[20]={"3"};
        int f_len=strlen(first);
        int s_len=strlen(second);
        char change_second[20]={'\0'};      //用來存(變化的除數)
        while((strlen(first)>strlen(second))||strcmp(first,second)>=0){       //被除數比除數大時要進行動作
            if((strlen(first)==strlen(second))&&strcmp(first,second)<0) break;//終止條件
            if((strlen(first)<strlen(second))) break;                         //被除數比除數小時,終止
            int f_len=strlen(first);         //被除數長度
            int s_len=strlen(second);        //除數長度
            int can=1;                       //第一次判斷,做補0動作
            if(f_len>=s_len && can==1){
                strcpy(change_second,second);//用來存變動的除數
                for(int x=0;x<f_len-s_len;x++){
                    strcat(change_second,"0");
                }
            }
            if((strcmp(first,change_second)>=0) && strlen(change_second)>=strlen(second)){
                div_sub(first,change_second); //被除數大於變化的除數,進行除法的減法動作
            }
            else{
                change_second[strlen(change_second)-1]='\0';//如果不是,則清掉多的0
                div_sub(first,change_second);
            }


        }
        printf("%s\n",first[0]=='\0'||first[0]=='0'?"YES":"NO");
    }
    return 0;
}

 
ZeroJudge Forum