0 0 投票数

Skyrim 经过尝试，写出了他的代码，顺利通过OJ，详细可阅读他的题解：程序设计-C语言程序设计基础-寒假作业3052再解》。

if ( strlen ( st ) == 1 ) {

} else {

}

if ( strlen ( st ) == 1 ) {
printf ( "%d" , st[0] - '0' + 1 );

} else {

}

pos是用来记录当前处在字符串的哪一个position，因为至少会有2个字符，所以st[1]必存在，pos直接初始化为1，last为st[0]，current为st[1]。

pos = 1;
last = st[pos - 1];
current = st[pos];

if ( last == current ) {

} else {

}

for (int i=0;i<pos;i++){
printf("%c",st[i]);
}

cuurent加1，就有可能产生进位，这里先不考虑进位。

printf("%c",st[pos]+1);

int p = 0;
for ( int i = pos + 1; i < strlen ( st ); i++ ) {
printf ( "%d", p );
p = abs ( p - 1 );
}

printf ( "%d", i % 2 );

if ( ( strlen ( c ) - i ) % 2 == 0 ) {
for ( ; i < strlen ( c ); i += 2 ) {
c[i] = '0';
c[i + 1] = '1';
}
} else {
c[i++] = '0';
for ( ; i < strlen ( c ); i += 2 ) {
c[i] = '1';
c[i + 1] = '0';
}
}
}

if ( last == current ) {
for ( int i = 0; i < pos; i++ ) {
printf ( "%c", st[i] );
}

printf ( "%c", st[pos] + 1 );
int p = 0;

for ( int i = pos + 1; i < strlen ( st ); i++ ) {
printf ( "%d", p );
p = abs ( p - 1 );
}

} else {

} else {
pos++;
last = st[pos - 1];
current = st[pos];
}

pos = 1 ;
last = st[pos - 1];
current = st[pos];

while ( pos < strlen ) {
if ( last == current ) {

} else {
pos++;
last = st[pos - 1];
current = st[pos];
}
}

if ( strlen ( st ) == 1 ) {<br>printf ( "%d"st[0] - '0' + 1 );</p> <p>} else {<br>pos = 1;</p> <p><pre><code>while ( pos < strlen ) {<br>last = st[pos - 1];<br>current = st[pos];</p> <p>if ( last == current ) {<br>for ( int i = 0; i < pos; i++ ) {<br>printf ( "%c", st[i] );<br>}</p> <p>printf ( "%c", st[pos] + 1 );<br>int p = 0;</p> <p>for ( int i = pos + 1; i < strlen ( st ); i++ ) {<br>printf ( "%d", p );<br>p = abs ( p - 1 );<br>}</p> <p>break;</p> <p>} else {<br>pos++;</p> <p>}<br>}<br></code></pre></p> <p>}

if ( pos == strlen ( st ) ) {<br>for ( int i = 0; i < pos - 1; i++ ) {<br>printf ( "%c", st[i] );<br>}</p> <p><pre><code>printf ( "%c", st[pos - 1] + 1 )<br></code></pre></p> <p>}

pos==strlen的时候，第二种情况就被简化了。

if ( pos == strlen ( st ) ) {
for ( int i = 0; i < pos - 2; i++ ) {
printf ( "%c", st[i] );
}

int d;
sscanf ( ( st + pos - 2 ), "%d", &d );
printf ( "%d", d + 1 );
}

sscanf()和sprintf()是很强大的两个函数，尤其是当他们用「类似」正则表达式的格式控制符来输入和输出数据的时候。

sscanf ( const char*, const char*, ... )

for ( int i = 0; i < pos - 1; i++ ) {<br>printf ( "%c", st[i] );<br>}</p> <p>int d;<br>sscanf ( ( st + pos - 1 ), "%d", &d );<br>printf ( "%d", d + 1 );<br>int p = 0;</p> <p>for ( int i = pos + 1; i < strlen ( st ); i++ ) {<br>printf ( "%d", p );<br>p = abs ( p - 1 );<br>}

if ( last == '9' ) {<br>for ( int i = 0; i < pos - 2; i++ ) {<br>printf ( "%c", st[i] );<br>}</p> <p><pre><code>printf ( "%c", st[pos - 2] + 1 );<br>int p = 0;</p> <p>for ( int i = pos - 1; i < strlen ( st ); i++ ) {<br>printf ( "%d", p );<br>p = abs ( p - 1 );<br>}</p> <p>break;<br></code></pre></p> <p>} else {</p> <p><pre><code>for ( int i = 0; i < pos - 1; i++ ) {<br>printf ( "%c", st[i] );<br>}</p> <p>int d;<br>sscanf ( ( st + pos - 1 ), "%d", &d );<br>printf ( "%d", d + 1 );<br>int p = 0;</p> <p>for ( int i = pos + 1; i < strlen ( st ); i++ ) {<br>printf ( "%d", p );<br>p = abs ( p - 1 );<br>}</p> <p>break;<br></code></pre></p> <p>}

if ( pos - 2 >= 0 ) {
printf ( "%c", st[pos - 2] + 1 );

} else {
printf ( '1' );
}

printf ( "%c", st[pos - 2] + 1 )

char ans[1000] = {0};

sprintf ( char*, const char*, ... );

sprintf ( ans, "%d", 123 );

ans数组就是’1’、’2’、’3’。

sprintf ( ans, "%f", -1.23 );

ans数组就是’-‘、’1’、’.’、’2’、’3’。

sprintf ( ans, "%.5f", -1.23 );

ans=“-1.23000”

sprintf ( ans, "%d=%x", 123 + 456, 123 + 456 );

123+456是579，第1个579会以%d的形式输出到ans中，然后输出中间的等号，第2个579会以%x的形式输出到ans中。

#include <stdio.h>

int main() {
char ans[100] = {0};
sprintf ( ans, "%d=%x", 123 + 456, 123 + 456 );
printf ( "%s\n", ans );
return 0;
}


sprintf ( ( ans + strlen ( ans ) ), "%c", st[i] );

if ( pos - 2 >= 0 ) {
sprintf ( ( ans + strlen ( ans ) ), "%c", st[pos - 2] + 1 );

} else {
sprintf ( ( ans + strlen ( ans ) ), "%c", '1' );
}

sprintf ( ( ans + strlen ( ans ) ), "%d", p );

if ( isTarget ( ans ) ) {
printf ( "%s", ans );

} else {
strcpy ( st, ans );
/** Again **/
}

do {
if ( strlen ( st ) == 1 ) {
} else {
while ( pos < strlen ( st ) ) {
if ( last == current ) {
if ( last == '9' ) {
} else {
}
} else {
}
if ( pos == strlen ( st ) ) {
}
}
}
} while ( !isTarget ( ans ) );

isTarget()也很好写。

int isTarget ( char* ans ) {

for ( int i=1;i<strlen(ans);i++ ) {
if ( ans[i] == ans[i - 1] ) {
return 0;
}
}

return 1;
}

（清空很重要，否则下一轮循环就没法用strlen(ans)判断输出到第几位了）

if ( strlen ( ans ) ) {
strcpy ( st, ans );

for ( int i = 0; i < strlen ( ans ); i++ ) {
ans[i] = 0;
}
}

<pre class="lang:c decode:true ">printf ( "%d", st[0] - '0' + 1 );</pre>

<pre class="lang:c decode:true ">printf ( "%s", ans );</pre>

<pre class="lang:c decode:true ">sprintf ( ( ans + strlen ( ans ) ), "%02d", d + 1 );</pre>

<pre class="lang:c decode:true ">sprintf ( ( ans + strlen ( ans ) ), "%d", p );</pre>

<pre class="lang:c decode:true ">sscanf ( ( st + pos - 2 ), "%d", &amp;d );</pre>

</code></pre>
<p>int isTarget ( char* ans ) {<br>for ( int i = 1; i < strlen ( ans ); i++ ) {<br>if ( ans[i] == ans[i - 1] ) {<br>return 0;<br>}<br>}<br>return 1;<br>}</p>
<p>int main () {<br>int cas;<br>scanf ( "%d", &cas );<br>for ( int t = 0; t < cas; t++ ) {<br>printf ( "case #%d:\n", t );<br>char st[1000] = {0};<br>scanf ( "%s", st );<br>char ans[1000] = {0};<br>do {<br>if ( strlen ( ans ) ) {<br>strcpy ( st, ans );<br>for ( int i = 0; i < strlen ( ans ); i++ ) {<br>ans[i] = 0;<br>}<br>}<br>if ( strlen ( st ) == 1 ) {<br>printf ( "%d", st[0] - '0' + 1 );<br>} else {<br>int pos = 1;<br>char last, current;<br>while ( pos < strlen ( st ) ) {<br>last = st[pos - 1];<br>current = st[pos];<br>if ( last == current ) {<br>if ( last == '9' ) {<br>for ( int i = 0; i < pos - 2; i++ ) {<br>sprintf ( ( ans + strlen ( ans ) ), "%c", st[i] );<br>}<br>if ( pos - 2 >= 0 ) {<br>sprintf ( ( ans + strlen ( ans ) ), "%c", st[pos - 2] + 1 );<br>} else {<br>sprintf ( ( ans + strlen ( ans ) ), "%c", '1' );<br>}<br>int p = 0;<br>for ( int i = pos - 1; i < strlen ( st ); i++ ) {<br>sprintf ( ( ans + strlen ( ans ) ), "%d", p );<br>p = abs ( p - 1 );<br>}<br>break;<br>} else {<br>for ( int i = 0; i < pos - 1; i++ ) {<br>sprintf ( ( ans + strlen ( ans ) ), "%c", st[i] );<br>}<br>int d;<br>sscanf ( ( st + pos - 1 ), "%02d", &d );<br>sprintf ( ( ans + strlen ( ans ) ), "%02d", d + 1 );<br>int p = 0;<br>for ( int i = pos + 1; i < strlen ( st ); i++ ) {<br>sprintf ( ( ans + strlen ( ans ) ), "%d", p );<br>p = abs ( p - 1 );<br>}<br>break;<br>}<br>} else {<br>pos++;<br>}<br>if ( pos == strlen ( st ) ) {<br>for ( int i = 0; i < pos - 2; i++ ) {<br>sprintf ( ( ans + strlen ( ans ) ), "%c", st[i] );<br>}<br>int d;<br>sscanf ( ( st + pos - 2 ), "%02d", &d );<br>sprintf ( ( ans + strlen ( ans ) ), "%02d", d + 1 );<br>}<br>}<br>}<br>} while ( !isTarget ( ans ) );<br>printf ( "%s", ans );<br>printf ( "\n" );<br>}<br>return 0;<br>}<br>优化，首先从消除代码复制开始。

<p>void printZeroAndOne ( int cnt, char* ans ) {</p>
<pre><code>int p = 0;

for ( int i = 0; i < cnt; i++ ) {
sprintf ( ( ans + strlen ( ans ) ), "%d", p );
p = abs ( p - 1 );
}
</code></pre>
<p>}中间进位的部分，各不相同，也没法做成一个函数。

“代码复制”这一个大忌解决掉，剩下的不进行优化，问题也不大。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void printTheSame ( int cnt, char* st, char * ans ) {
for ( int i = 0; i < cnt; i++ ) {
sprintf ( ( ans + strlen ( ans ) ), "%c", st[i] );
}
}

void printZeroAndOne ( int cnt, char* ans ) {
int p = 0;
for ( int i = 0; i < cnt; i++ ) {
sprintf ( ( ans + strlen ( ans ) ), "%d", p );
p = abs ( p - 1 );
}
}

int isTarget ( char* ans ) {
for ( int i = 1; i < strlen ( ans ); i++ ) {
if ( ans[i] == ans[i - 1] ) {
return 0;
}
}
return 1;
}

int main () {
int cas;
scanf ( "%d", &cas );
for ( int t = 0; t < cas; t++ ) {
printf ( "case #%d:\n", t );
char st[1000] = {0};
scanf ( "%s", st );
char ans[1000] = {0};
do {
if ( strlen ( ans ) ) {
strcpy ( st, ans );
for ( int i = 0; i < strlen ( ans ); i++ ) {
ans[i] = 0;
}
}
if ( strlen ( st ) == 1 ) {
printf ( "%d", st[0] - '0' + 1 );
} else {
int pos = 1;
char last, current;
while ( pos < strlen ( st ) ) {
last = st[pos - 1];
current = st[pos];
if ( last == current ) {
if ( last == '9' ) {
printTheSame ( pos - 2, st, ans );
if ( pos - 2 >= 0 ) {
sprintf ( ( ans + strlen ( ans ) ), "%c", st[pos - 2] + 1 );
} else {
sprintf ( ( ans + strlen ( ans ) ), "%c", '1' );
}
printZeroAndOne ( strlen ( st ) - pos + 1, ans );
break;
} else {
printTheSame ( pos - 1, st, ans );
int d;
sscanf ( ( st + pos - 1 ), "%02d", &d );
sprintf ( ( ans + strlen ( ans ) ), "%02d", d + 1 );
printZeroAndOne ( strlen ( st ) - pos - 1, ans );
break;
}
} else {
pos++;
}
if ( pos == strlen ( st ) ) {
printTheSame ( pos - 2, st, ans );
int d;
sscanf ( ( st + pos - 2 ), "%02d", &d );
sprintf ( ( ans + strlen ( ans ) ), "%02d", d + 1 );
}
}
}
} while ( !isTarget ( ans ) );
printf ( "%s", ans );
printf ( "\n" );
}
return 0;
}
2017-02-06_17-21一稿
2017-02-09_17-29二稿

0
0
投票数评分


 
 发表留言 订阅评论 登录 提醒 此页的新后续评论 对我的评论的新回复 我允许使用我的电子邮件地址接收新的评论和回复的通知（可以在任何时候取消订阅） Label 在点击发表评论按钮时，网络请求的数据包含浏览器版本、操作系统版本和 IP 地址；您的网络服务提供商、雇主或学校、政府机构可能会看到您的访问活动；根据浏览器默认行为、操作系统设置和安全防护软件的设置不同，您的浏览器可能会也可能不会在本地 Cookies 缓存您输入的用户名、邮箱以便下次评论使用。 请对自己的言行负责。 用户名* 您想以什么身份发表评论 邮箱* 邮箱将在您的评论被回复时给您通知 网站 （可选）如果您也有个人网站，不妨分享一下 我对这篇文章的评分 这篇文章给您带来多大帮助 Label 在点击发表评论按钮时，网络请求的数据包含浏览器版本、操作系统版本和 IP 地址；您的网络服务提供商、雇主或学校、政府机构可能会看到您的访问活动；根据浏览器默认行为、操作系统设置和安全防护软件的设置不同，您的浏览器可能会也可能不会在本地 Cookies 缓存您输入的用户名、邮箱以便下次评论使用。 请对自己的言行负责。 用户名* 您想以什么身份发表评论 邮箱* 邮箱将在您的评论被回复时给您通知 网站 （可选）如果您也有个人网站，不妨分享一下 0 评论 内联反馈 查看所有评论