很久不做oj,发现思维明显跟不上(大学时候也跟不上:)).一直在想文件输入的接口是什么来着,终于google到
freopen("data", "r", stdin);
程序设计重在思维:我总结有三点,一是项目管理思维(开发方法、人员结构、管理方式);二是软件工程思维(软件架构);三是解题逻辑思维(针对特定逻辑问题的思路)
思维需要锻炼,且要持续不断.oj做题正是锻炼解题逻辑思维的好方法.
POJ-1002 - 487-3279
问题描述:
电话号码有多种写法,010-8888,0108888,-010-8888,-0-1-0-8-8-8-8-等等.如果要把A-Z大写字母映射成数字的话可以出现类似AAA-ABCD,-A-A-AABCD等形式.
但是最终,都能映射成数字的形式,并且类似000-0000这样的3个数字-4个数字的形式是标准形式.问题就是:给定一系列的上面提到的电话号码,要求输入标准形式以及此电话号码出现的次数.电话号码输出按照字典序.
问题分析:
1. 需要理解输入,可能含有-,A-Z,0-9,并且每行输入是不定长的.这个可以先用合适的15(7个数字,8个-).不行再加长.
2. 输入格式:(1)字典序 (2)电话+个数 (3)一个重复电话也没有的情况下,要输出"No duplicates."
解题思路:
1. 直接的想法是把输入转换成数字,之后数组中标记数字出现的个数.之后遍历数组,进行输出.
AC代码:(效率不高,简单方法)
#include <stdio.h> #include <stdlib.h> //result char g_str [ 8 ]; //map int number_map [] = { // 'A' 2 , 2 , 2 , 3 , 3 , 3 , 4 , 4 , 4 , 5 , 5 , 5 , 6 , 6 , 6 , 7 , 0 , 7 , 7 , 8 , 8 , 8 , 9 , 9 , 9 , 0 }; int result_map [ 10000000 ]; int str_to_number( char * str) { int i = 0; int t = 0; int n = 0; for( i = 0; i < 48; ++ i) { if ( *( str + i) < '0' || *( str + i) > 'Z' || ( *( str + i) > '9' && *( str + i) < 'A')) continue; if( *( str + i) < 'A') { t = *( str + i) - '0'; } else { t = number_map [ *( str + i) - 'A' ]; } n *= 10; n += t; } return n; } char * number_to_standstr( int n) { int i = 0 , t = 0; for ( i = 7; i > 0; -- i) { t = n % 10; n /= 10; if ( i > 3) g_str [ i ] = '0' + t; else g_str [ i - 1 ] = '0' + t; } g_str [ 3 ] = '-'; return g_str; } int c = 0; int main( void) { char str [ 48 ]; int r = 0 , t = 0; //freopen("data", "r", stdin); memset( result_map , 0 , sizeof( result_map)); // number count scanf( "%d" , & c); t = 0; // deal with every number while( c > 0) { memset( str , '-' , sizeof( str)); scanf( "%s" , str); -- c; r = str_to_number( str); result_map [ r ] += 1; } c = 0; while( t < 10000000) { if ( result_map [ t ] > 1) { ++ c; printf( "%s %d \n " , number_to_standstr( t ), result_map [ t ]); } ++ t; } if ( 0 == c) printf( "No duplicates. \n "); return 0; }另附超级简洁代码一段,来自csdn
#include <stdio.h> int main( ) { static int i , j , k , n , hash [ 10000000 ] = { 0 }; char tel [ 32 ], map [ 256 ]; map [ 'A' ] = map [ 'B' ] = map [ 'C' ] = 2; map [ 'D' ] = map [ 'E' ] = map [ 'F' ] = 3; map [ 'G' ] = map [ 'H' ] = map [ 'I' ] = 4; map [ 'J' ] = map [ 'K' ] = map [ 'L' ] = 5; map [ 'M' ] = map [ 'N' ] = map [ 'O' ] = 6; map [ 'P' ] = map [ 'R' ] = map [ 'S' ] = 7; map [ 'T' ] = map [ 'U' ] = map [ 'V' ] = 8; map [ 'W' ] = map [ 'X' ] = map [ 'Y' ] = 9; for ( i = '0'; i <= '9'; i ++) map [ i ] = i - '0'; scanf( "%d" , &n); while (n --) { scanf( "%s" , tel); for ( i = k = 0 , j = 1000000; tel [ i ]; i ++) { if ( tel [ i ] == '-') continue; k += map [ tel [ i ]] * j; j /= 10; } hash [ k ] ++; } for ( i = j = 0; i < 10000000; i ++) if ( hash [ i ] > 1) { j ++; printf( "d-d %d \n " , i / 10000 , i % 10000 , hash [ i ]); } if ( j == 0) puts( "No duplicates."); }转载于:https://www.cnblogs.com/linucos/archive/2011/10/11/2207305.html
相关资源:各显卡算力对照表!