BITCS2016程序设计 | 10. 琪露诺的完美算数教室——⑨的统计I

来源:互联网 发布:sql索引超出数组界限 编辑:程序博客网 时间:2024/05/22 06:10

10. 琪露诺的完美算数教室——⑨的统计I

成绩10开启时间2016年09月6日 星期二 11:00折扣0.8折扣时间2016年09月10日 星期六 23:55允许迟交否关闭时间2016年10月10日 星期一 23:55

众所周知,琪露诺(チルノ,Cirno)是幻想郷 (げんそうきょう)中首屈一指的天才,可以说⑨就是她的代名词。

然而如今,她遇到了一个和⑨有关的难题。你能帮助她么?

题目是这样的,给出两个数 a 和 b (0 <= a <= b <= 10^10000),求 a 到 b 之间(包括a和b)的数字中,有多少个数字是包含9的(例如 19,910 等都是包含9的数字)。

输入

第一行为一个数字 T (0 < T <= 100) 表示数据组数。
之后的 T 行,每行包含两个数 a 和 b (0 <= a <= b <= 10^10000)。

输出

对每组数据输入,输出一个数字,表示 a 到 b 之间的数字中(包括a和b),有多少个数字是包含9的。(注意:答案可能很大)

 测试输入关于“测试输入”的帮助期待的输出关于“期待的输出”的帮助时间限制关于“时间限制”的帮助内存限制关于“内存限制”的帮助额外进程关于“{$a} 个额外进程”的帮助测试用例 1以文本方式显示
  1. 1↵
  2. 0 9↵
以文本方式显示
  1. 1↵
1秒64M0解题思路:
这道题的思路是先计算出第一个数的包含9的个数,示例中的[0,0],然后计算出第二个数包含9的数的个数,实例中的[0,9],这两个过程实际是一样的,然后将两个9的个数做差,因为检测9程序会忽略边界问题,所以还需判断输入的边界这个数是否包含9,若有则需在统计结果中+1。这道题还有一个难点就是数值很大,需要改写之前a+b的程序为1 0000 0000进制,好应对题设中对存储空间的局限。


代码:
#include "stdio.h"#include "string.h"void multiply( long *num, int m ){int length;for( length = 1259; length >= 0; length --  )if( num[ length ] )break;for( int i = 0; i <= length; i ++ )num[ i ] *= m;for( int i = 0; i <= length; i ++ ){if( num[ i ] >= 100000000 ){num[ i + 1 ] += ( num[ i ] / 100000000 );num[ i ] %= 100000000;}//else//break;}return;}void plus( long *num, int p ){num[ 0 ] += p;for( int i = 0; i < 1259; i ++ )if( num[ i ] >= 100000000 ){num[ i + 1 ] += 1;num[ i ] -= 100000000;}elsebreak;return;}void minus( long *start, long *end, long *result ){int isChange = 1;int length;for( length = 1259; length >= 0; length -- )if( start[ length ] )break;for( int i = 0; i <= length ; i ++ ){result[ i ] = start[ i ] - end[ i ];if( result[ i ] < 0 ){start[ i + 1 ] -= 1;result[ i ] += 100000000;}}return;}int countNumOf9( char *input, long *output ){int length = strlen( input ), tmpVal, is9 = 0;long numStart[ 1260 ] = { 0 }, numEnd[ 1260 ] = { 0 };for( int i = 0; i < length; i ++ ){multiply( numStart, 10 );tmpVal = input[ i ] - '0';;plus( numStart, tmpVal );}for( int i = 0; i < length; i ++ ){tmpVal = input[ i ] - '0';if( !is9 ){multiply( numEnd, 9 );plus( numEnd, tmpVal );if( tmpVal == 9 )is9 = 1;}elsemultiply( numEnd, 9 );}minus( numStart, numEnd, output );return is9;}void printResult( long *result ){int length;for( length = 1259; length >= 0; length -- )if( result[ length ] )break;if( length == -1 )printf( "0" );else{printf( "%ld", result[ length -- ] );for( int i = length; i >= 0; i -- )printf( "%08ld", result[ i ] );}printf( "\n" );return;}int main(){int N, is9;char start[ 10005 ], end[ 10005 ];long numStart9[ 1260 ], numEnd9[ 1260 ], result[ 1260 ];scanf( "%d", &N );while( N -- ){memset( start, 0, sizeof( start ) );memset( end, 0, sizeof( end ) );memset( numStart9, 0, sizeof( numStart9 ) );memset( numEnd9, 0, sizeof( numEnd9 ) );memset( result, 0, sizeof( result ) );scanf( "%s %s", &start, &end );is9 = countNumOf9( start, numStart9 );is9 = countNumOf9( end, numEnd9 );minus( numEnd9, numStart9, result );if( is9 )plus( result, 1 );printResult( result );}return 0;}

结果:


这道题目的方法上借鉴了很多online上的思路贴,真心感叹自己要努力的地方还有很多!哈哈哈加油吧!





0 0
原创粉丝点击