zoukankan      html  css  js  c++  java
  • OpenJudge 2952 循环数 C++

    链接地址:

    http://bailian.openjudge.cn/practice/2952/

    题目:

    总时间限制:
    1000ms
    内存限制:
    65536kB
    描述
    n 位的一个整数是循环数(cyclic)的条件是:当用一个 1 到 n 之间的整数去乘它时, 会得到一个将原来的数首尾相接循环移动若干数字再在某处断开而得到的数字。也就是说,如果把原来的数字和新的数字都首尾相接,他们得到的环是相同的。只是 两个数的起始数字不一定相同。例如,数字 142857 是循环数,因为:
    142857 *1 = 142857
    142857 *2 = 285714
    142857 *3 = 428571
    142857 *4 = 571428
    142857 *5 = 714285
    142857 *6 = 857142



    输入
    写一个程序确定给定的数是否是循环数。输入包括多个长度为 2 位到 60 位的整数。(注意,先导的0也是合理的输入不应该被忽略,例如 "01"是 2 位数,"1" 是 1 位数。)
    输出
    对于每一个输入的整数,输出一行表明它是否是循环数。

    样例输入
    142857
    142856
    142858
    01
    0588235294117647
    
    
    
    样例输出
    142857 is cyclic
    142856 is not cyclic
    142858 is not cyclic
    01 is not cyclic
    0588235294117647 is cyclic
    
    
    来源
    1047

    思路:

    输入包括多个长度为 2 位到 60 位的整数,所以不能直接使用int保存
    因为要遍历每次乘法可改为每次加上原来的是数,乘法变成加法
    比较使用循环比较

    所以这个的重点是大数加法

    代码:

     1 #include <iostream>
     2 #include <string>
     3 using namespace std;
     4 
     5 string sum(string s1,string s2)
     6 {
     7     if(s1.length()<s2.length())
     8     {
     9         string temp=s1;
    10         s1=s2;
    11         s2=temp;
    12     }
    13     int i,j;
    14     for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--)
    15     {
    16         s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0));   //注意细节
    17         if(s1[i]-'0'>=10)
    18         {
    19             s1[i]=char((s1[i]-'0')%10+'0');
    20             if(i) s1[i-1]++;
    21             else s1='1'+s1;
    22         }
    23     }
    24     return s1;
    25 }
    26 
    27 int main()
    28 {
    29     string str;
    30     string::size_type i,j,size_str;
    31     while(cin>>str)
    32     {
    33         string str1(str);
    34         size_str= str.size();
    35         while(--size_str)
    36         {
    37             str1 = sum(str1,str);
    38             if(str1.size() != str.size()) break;
    39             for(i = 0; i < str.size(); i++)
    40             {
    41                 for(j = 0; j < str1.size(); j++)
    42                 {
    43                     if(str1[j] != str[(i + j) % str.size()]) break;
    44                 }
    45                 if(j >= str1.size()) break;
    46             }
    47             if(i >= str.size()) break;
    48         }
    49         if(size_str) cout<<str<<" is not cyclic"<<endl;
    50         else cout<<str<<" is cyclic"<<endl;
    51     }
    52     return 0;
    53 }

    参考资料:

    http://blog.csdn.net/hp_justdoit/article/details/8297003

  • 相关阅读:
    Java实现字符串的包含
    Java实现字符串的包含
    Java实现字符串的包含
    Java实现字符串的包含
    Java实现字符串的包含
    穷文富理撑死工,得先学门能挣钱的手艺
    Windows更新清理工具 (winsxs 清理工具)
    SQLite实现内存键值存储
    Qt5.7.0移植到4412
    罗辑思维2014 第11集 迷茫时代的明白人(慢慢来,能做一点是一点),有书卖
  • 原文地址:https://www.cnblogs.com/mobileliker/p/3512627.html
Copyright © 2011-2022 走看看