|
¡¡ºÇŬ²½Åù¤ò°ìÀڹͤ¨¤ºÁÇľ¤Ëºî¤Ã¤¿¤é°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤·¤¿¡£
¡¡¾ò·ï¤ò¸í²ò¤·¤Æ¤¤¤ë¤«¤â¤·¤ì¤Þ¤»¤ó¡£»ä¤Î²ò¼á¤Ïanalyze¤ÎÃæ¤´¤í¤Ë¤¢¤ë
printf¤Î¤È¤ª¤ê¤Ç¤¹¡£´Ö°ã¤Ã¤Æ¤¤¤¿¤é¸æ»ØÅ¦¤¯¤À¤µ¤¤¡£
¡¡¤Ê¤ª·ÇºÜ¤ËÅö¤¿¤Ã¤Æ¹Ô¿ô¤òÀáÌ󤹤뤿¤á¤Ë°ú¿ô¥Á¥§¥Ã¥¯¤Ï¹Ô¤Ã¤Æ¤¤¤Þ¤»¤ó¡£
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/* ÅÓÃæ·Ð²á¤òɽ¼¨¤¹¤ë¤«¡© */
int g_verbose = 0;
/* ·ë²Ì³ÊǼÎΰè */
typedef struct _result{
int count[3];
}result_t;
/* ¥×¥í¥È¥¿¥¤¥× */
result_t analyze(const char* original);
int get_S(const char* sequence);
int condition1(int S);
int condition2(const char* sequence, int S, int n);
int condition3(const char* sequence, int S, int n, int X);
/* main */
int main(int argc, char* argv[]){
result_t result = analyze(argv[1]);
printf("¾ò·ï£±:%d\n¾ò·ï£²:%d\n¾ò·ï£³:%d\n",
result.count[0], result.count[1], result.count[2]);
return 0;
}
/* ²òÀÏ */
result_t analyze(const char* original){
/* ·ë²Ì³ÊǼÎΰè */
result_t result = { {0, 0, 0} };
/* ºî¶ÈÎΰè */
char* work_area;
/* ¥ë¡¼¥×ÊÑ¿ôÅù */
size_t ix_delete, ix_insert, ix_from, ix_to;
int ch;
/* ²òÀÏÍÑÊÑ¿ô */
size_t n;
int S;
int X;
/* ÅÓÃæ·Ð²áɽ¼¨ÍÑÏ¢ÈÖ */
int no = 0;
/* ¾ê;·¸¿ô¤Î»»½Ð */
X = get_S(original);
if ( g_verbose ) printf("X=%d\n", X);
if ( X == 0 ){
printf("X¤¬0¤Ë¤Ê¤ë¤Î¤Ç²òÀϤǤ¤Þ¤»¤ó¡£\n");
return result;
}
/* Ťµ¤Î¼èÆÀ¤Èºî¶ÈÎΰè¤Î½é´ü²½ */
n = strlen(original);
work_area = (char*)malloc(sizeof(char)*(n+1));
work_area[n] = '\0';
if ( g_verbose ){
printf("¾ò·ï£±¡§S!=0\n");
printf("¾ò·ï£²¡§0 < S <= n(%3d) ¤«¤Ä RS=0\n", n);
printf("¾ò·ï£³¡§X-n(%3d)<= S < n(%3d) ¤«¤Ä RS=1\n", X-n, n);
}
/* ÀèÆ¬¤«¤é½ç¤Ëºï½ü¤¹¤ë */
for ( ix_delete = 0; ix_delete < n; ++ix_delete ){
/* ÀèÆ¬¤«¤é½ç¤ËÁÞÆþ¤¹¤ë */
for ( ix_insert = 0; ix_insert < n; ++ix_insert){
for ( ch = '0'; ch <= '1'; ++ch ){
/* ·ÏÎó¤ÎºîÀ® */
ix_from = 0;
for ( ix_to = 0; ix_to < n; ++ix_to ){
if ( ix_from == ix_delete ) ++ix_from;
if ( ix_to == ix_insert ) work_area[ix_to] = ch;
else work_area[ix_to] = original[ix_from++];
}
if ( g_verbose ){
++no;
printf("%05d:%s", no, work_area);
}
/* ¾ò·ïÀ®Î©È½Äê */
S = get_S(work_area) % X;
if ( g_verbose ) printf(" S=%03d RS=%c", S, ( (0 < S && S <= (int)n) ? work_area[S-1] : '-'));
if ( condition1(S) ) ++result.count[0];
if ( condition2(work_area, S, n) ) ++result.count[1];
if ( condition3(work_area, S, n, X) ) ++result.count[2];
if ( g_verbose ) printf("\n");
}
}
}
free(work_area);
return result;
}
/* ·ÏÎó¤Î½Å¤ß¤Ä¤¥Ó¥Ã¥È¹ç·× */
int get_S(const char* sequence){
int S = 0;
int i;
for ( i = 1; sequence[i-1] != '\0'; ++i )
if ( sequence[i-1] == '1' ) S += i;
return S;
}
/* S¡á£°¤Ç¤Ê¤¤¤â¤Î */
int condition1(int S){
if ( S != 0 ){
if ( g_verbose ) printf(" Y");
return 1;
}else{
if ( g_verbose ) printf(" N");
return 0;
}
}
/* £°¡ãS¡å£î¡¡¤«¤Ä¡¡RS¡á£±¤Ç¤Ê¤¤¤â¤Î */
int condition2(const char* sequence, int S, int n){
if ( 0 < S && S <= n && sequence[S-1] != '1' ){
if ( g_verbose ) printf(" Y");
return 1;
}else{
if ( g_verbose ) printf(" N");
return 0;
}
}
/* X¡Ý£î¡åS¡ã£î¡¡¤«¤Ä¡¡RS¡á£°¤Ç¤Ê¤¤¤â¤Î */
int condition3(const char* sequence, int S, int n, int X){
if ( X - n <= S && S < n && 0 < S && sequence[S-1] != '0' ){
if ( g_verbose ) printf(" Y");
return 1;
}else{
if ( g_verbose ) printf(" N");
return 0;
}
}
|