• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
LyonLys
愿意在角落唱沙哑的歌 再大声也都是给你 请用心听 不要说话 Contact me via E-mail: lyon.lys@gmail.com
博客园    首页    新随笔    联系   管理    订阅  订阅

hdu 4002 Find the maximum

Problem - 4002

  不知道思路了。。居然是大一上学期的时候做的题,今天找回来才发现是区域赛的题。为什么那时候就写这么恶心的代码?_(:з」∠)_ 好像很厉害的样子。。

  写一下那时候我的记录下来的思路,不知道对不对的了。。囧:

1.筛素数70个左右

2.求素数的乘积,要用到高精度乘法

3.把70个积都存下来

4.读入字符串,然后比较大数,超过已存素数就输出

  大概就这样子。

代码如下:

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 #include<math.h>
  5 
  6 int prime[101];
  7 char *product[101];
  8 
  9 void produce_primes(void)
 10 {
 11     int i, j;
 12     prime[1]=2;
 13     prime[0]=1;
 14     i=3;
 15     while(prime[0] < 70)
 16     {
 17         for(j=1; j <= prime[0]; j++)
 18             if(!( i%prime[j] ))break;
 19         if( j > prime[0] )
 20         {
 21             prime[0]++;
 22             prime[prime[0]]=i;
 23         }
 24         i++;
 25     }
 26 }
 27 
 28 char *multiply( char *a, char *b )
 29 {
 30     int i, j, k;
 31     int len_a=strlen(a);
 32     int len_b=strlen(b);
 33     int *i_product=(int *)malloc((len_a+len_b)*sizeof(int));
 34     char *c_product=(char *)malloc((len_a+len_b+1)*sizeof(char));
 35 
 36     memset(i_product, 0, (len_a+len_b)*sizeof(int));
 37     memset(c_product, 0, (len_a+len_b)*sizeof(char));
 38     c_product[len_a+len_b]='\0';
 39 
 40     for( i=len_a-1; i >= 0; i-- )
 41         for( j=len_b-1; j >= 0; j-- )
 42         i_product[i+j+1]+=(a[i]-'0')*(b[j]-'0');
 43     for( i=len_a+len_b-1; i >= 1; i-- )
 44     {
 45         i_product[i-1]+=i_product[i]/10;
 46         c_product[i]=i_product[i]%10+'0';
 47     }
 48 
 49     c_product[0]=i_product[0]+'0';
 50     i=0;
 51     while(c_product[i] == '0' && i<len_a+len_b-1)i++;
 52 
 53     return &c_product[i];
 54 }
 55 
 56 char *num_to_ch(int a)
 57 {
 58     char *res=(char *)malloc(11*sizeof(char));
 59     int i;
 60 
 61     memset(res, 0, 11*sizeof(char));
 62     res[10]='\0';
 63     res[9]='0';
 64     i=9;
 65     while(a)
 66     {
 67         res[i]= a%10 + '0';
 68         i--;
 69         a/=10;
 70     }
 71     i=0;
 72     while(res[i] == 0)i++;
 73 
 74     return &res[i];
 75 }
 76 
 77 int cmp(char *a,char *b)
 78 {
 79     if(strlen(a) != strlen(b))
 80         if(strlen(a) > strlen(b))return 1;
 81         else return -1;
 82     else return strcmp(a,b);
 83 }
 84 
 85 int main()
 86 {
 87     int i, n;
 88     char in[105];
 89     produce_primes();
 90     i=0;
 91     product[0]=num_to_ch(prime[1]);
 92 
 93     while(strlen(product[i]) <= 100)
 94     {
 95         i++;
 96         product[i]=multiply(product[i-1], num_to_ch(prime[i+1]));
 97     }
 98 
 99     scanf("%d", &n);
100     while(n--)
101     {
102         i=0;
103 
104         scanf( "%s", in );
105         while(cmp(product[i],in) <= 0)i++;
106 
107         printf("%s\n", product[i-1]);
108     }
109 
110     return 0;
111 }
View Code

 

——written by Lyon

 

posted @ 2013-07-15 02:39  LyonLys  阅读(208)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3