サイズが「10,000」にもなる文字列があります。9 で割り切れるサブシーケンスを数えなければなりません。
サブシーケンス: サブシーケンスは、指定された文字列の文字の順序が維持される配置です。例: 指定された文字列が 10292 の場合、そのサブシーケンスの一部は 1、102、10、19、12、12 (2 が 2 回来るので 12 は 2 回)、129、029、09、092 などです。指定された文字列のサブシーケンスは、201 (2 と 0 は 1 の前に来ることはできません)、921、0291 などです。
ビットシフトを使用して、指定された文字列のすべてのサブシーケンス (パワーセット) を生成しようとしました。各文字列が 9 で割り切れるかどうかを確認します。ただし、文字列の長さが 10 以下である限り、これは正常に機能します。その後、適切なサブシーケンスを取得できません (一部のサブシーケンスは負の数で表示されます)。
以下は私のコードです:
scanf("%s", &str); //input string
int n=strlen(str); //find length of string
//loop to generate subsequences
for(i=1;i<(1<<n);++i){
string subseq;
for(j=0;j<n;++j){
if(i&(1<<j)){
subseq+=str[j]; // generate subsequence
}
}
//convert generated subseq to int; number is 'long' tpye
number=atol(subseq.c_str());printf("%ld\n", number);
//ignore 0 and check if number divisible by 9
if(number!=0&&number%9==0)count++;
}
printf("%ld\n", count);