軍隊での符号化アルゴリズム1


生意気な時に1週間連続...?すべて前回掲載した記事のように、インフラで料金講座を購入して勉強し、1日1題を解くことを目標にしています.今は基本的なものなので、単独で整理したりアップロードしたりしていませんが、今日は問題を解くときに背中を刺されたような気がします...記事をアップロード...
まず、今日私が解決しなければならない問題は、数字が混ざった文字列を入力すると、数字だけを区別し、数字を合わせて数字の約数を求めることです.
たとえば
t 0 e 0 a 1 c 2 herから数字を抽出すると,0,1,2である.この場合一番前の0を除くので12です.
第2の例では、rgf 0 gqE 5 F 40 dgsから、0、5、4、0という数字が抽出される.このとき、先頭の0の他に540があります.
まずは私が編んだハーモニー
#include<stdio.h>
#include<iostream>
#include <string.h>
#include<cmath>

using namespace std;

int main(){
    
    char mix[51]={0,};
    int num[11] ={0,}, cnt=0;
    
    scanf("%s", &mix);
    
    int len = strlen(mix);
    
    for(int i =0; i<len; i++){
        if(mix[i]<65){
            num[cnt] = mix[i] -'0';
            cnt++;
        }
    }
    
    int check = cnt;
    int fin=0;
    for(int i =0; i<cnt; i++){
        
        if(num[i]!=0){
            fin = fin + pow(10, check-1)*num[i];
            check = check -1 ;
        }
        else{
            check = check -1 ;
        }
        
      
    }
   int div_cnt=0;
   for(int i =1; i<=fin; i++){
       if(fin%i==0){
           div_cnt++;
       }
   }
    cout<<fin<<endl;
    cout<<div_cnt;
    
}
汚く見えます.砲口も何度もあり、特に数字を抽出して1つの数字に再結合する過程で、面倒な方法を選んだ.
問題解きの授業を見て「本当にバカだ...」私はそう思います.
for(int i =0; i<cnt; i++){
        
        if(num[i]!=0){
            fin = fin + pow(10, check-1)*num[i];
            check = check -1 ;
        }
        else{
            check = check -1 ;
        }
        
      
    }
上のコードのように、砲口が一番前に0でないときだけpow関数を使って数字を組み合わせる方法を選択しますが、
for(i=0; a[i]!='\0'; i++){
	if(a[i]>=48 && a[i]<=57){
		res=res*10+(a[i]-48);
	}
}
このようにAskyコード値を一度に設定することで,数値が0であるか否かを区別する必要がなく,10を乗じ続けるだけでこの問題をうまく解決できる.
コードはできるだけ簡潔で明確に...