北大1047题

题目链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=1047

 

这道题难点:

1,带前导0的大整数乘法,最终结果怎么处理

2,如何判断结果中的数字和原数中的数字是否相同

解决方法:

1,一个m位数和一个n位数相乘,结果最多为m+n位,最少位m+n-1位。根据本题的条件限制,假设带前导0的op为m位,另一个乘数为1位或者2位且最大不超过60,所以结果可能的位数为m、m+1、m+2位,只要能确定m+1、m+2位不为0就知道结果为m位,如果能确定m+1、m+2位有一位不为0,就知道这个数一定不是循环数。

2,为了判定结果中的数字和原数中的数字是否相同用了两个整型数组,统计两个数中各个数字出现的频率,然后调用标准库算法比较这两个数组中的内容是否相等就可以判断结果了。

 

#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
using namespace std;

#define MAX 61

int main()
{
 freopen("in.txt","r",stdin);
 int in1[10],in2[10];
 char op1[MAX],op2[3],res[MAX+2];
 int i,j,k,len1,len2,len;
 stringstream ss;
 bool yes;
 while(cin >> op1)
 {
  yes = true;
  i = 0;
  memset(in1,0,sizeof(in1));
  while(op1[i] != '/0')
  {
   ++in1[op1[i] - '0'];
   ++i;
  }

  len1 =strlen(op1);
  reverse(op1,op1 + len1);

  for(i = 1;i <= len1;++i)
  {
   ss << i;
   ss >> op2;
   ss.clear();
   len2 = strlen(op2);
   reverse(op2,op2 + len2);
   memset(res,0,sizeof(res));

   for(j = 0;j < len1;++j)
   {
    for(k = 0;k < len2;++k)
    {
     res[j+k] += (op1[j] - '0') * (op2[k] - '0');
     if(res[j+k] > 9)
     {
      res[j+k+1] += res[j+k] / 10;
      res[j+k] %= 10;
     }
    }
   }

   
   if(res[len1] != 0 ||res[len1 + 1] != 0)
   {
    reverse(op1,op1 + len1);
    cout << op1 << " is not cyclic" << endl;
    yes = false;
    break;
   }
   else
    len = len1;
   
   memset(in2,0,sizeof(in2));
   for(j = 0;j < len;++j)
    ++in2[res[j]];
   
   if(!equal(in1,in1 + 10,in2))
   {
    reverse(op1,op1 + len1);
    cout << op1 << " is not cyclic" << endl;
    yes = false;
    break;
   }
  }

  if(yes)
  {
   reverse(op1,op1 + len1);
   cout << op1 << " is cyclic" << endl;
  }
 }
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值