zoukankan      html  css  js  c++  java
  • 算法竞赛入门经典中的基础数学题

    uva575:这道题目没什么好说的

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 #include<string>
     7 #include<cctype>
     8 #include<vector>
     9 #include<map>
    10 using namespace std;
    11 const int maxn=40;
    12 string s;
    13 int a[maxn];
    14 int main()
    15 {
    16     long long sum;
    17     while(cin>>s)
    18     {
    19         if(s[0]=='0')
    20         break;
    21         sum=0;
    22         memset(a,0,sizeof(a));
    23         for(int i=0;i<s.length();i++)
    24             a[s.length()-i-1]=s[i]-'0';
    25         for(int i=0;i<s.length();i++)
    26         sum+=a[i]*(pow(2,i+1)-1);
    27         cout<<sum<<endl;
    28     }
    29     return 0;
    30 }
    View Code


    uva10110:

    这道题目考虑最后一个数的因子个数,如果是偶数则是关闭的,奇数则是开着的,显然一般数都是偶数,只有一种情况,是全部平方数的时候才是奇数,于是判断

    sqrt(n)*sqrt(n)是否等于n即可

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 using namespace std;
     6 long long  n;
     7 void judge()
     8 {
     9     long long  b=sqrt(n);
    10     if(b*b==n)
    11         cout<<"yes"<<endl;
    12     else
    13         cout<<"no"<<endl;
    14 }
    15 int main()
    16 {
    17     while(cin>>n)
    18     {
    19         if(n==0)
    20             break;
    21         judge();
    22     }
    23     return 0;
    24 }
    View Code

    uva550(参考别人的题解)

    题意:给出一个进制,一个数的最低位,和另外的一个数,比如10进制,第一个数字的最低位是7,第二个数字是4,

    和规则(XXXXX7 * 4 = 7XXXXX,例子: 179487 * 4 = 717948 )求出第一个数字的最小长度。

    看起来很难,其实动笔写写就明白了。

    输入k,m,n,原来的数字为s,因为s的最后一位为m,则s*n的最后一位为s*n%k,而s*n%k又是s的倒数第二位,这样又可以计算出ans*n的倒数第二位;

    先令s=m*n,然后下一个最低位即为s=s%k*n+s/k,只要等于m就跳出

    以此类推,直到乘积+原来的进位==最低位。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<string>
     5 #include<cmath>
     6 #include<vector>
     7 #include<map>
     8 #include<stack>
     9 #include<cctype>
    10 using namespace std;
    11 int n,k,m;
    12 void work()
    13 {
    14     int cnt,s;
    15     cnt=1;
    16     s=n*m;
    17     while(s!=n)
    18     {
    19         s=s%k*m+s/k;
    20         cnt++;
    21     }
    22     cout<<cnt<<endl;
    23 }
    24 int main()
    25 {
    26     while(cin>>k>>n>>m)
    27     {
    28         work();
    29     }
    30     return 0;
    31 }
    View Code

    uva568

    开始交上去,就贡献了1WA,现在来帖一下别人的解题思路:

    循序從1~10000一直乘上去,由於最大值是到10000,因此每次計算完留下結尾非零的五位數再去做乘法,即可得到正確的最後一位非零數字

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<string>
     5 #include<cmath>
     6 #include<vector>
     7 #include<map>
     8 #include<stack>
     9 using namespace std;
    10 int n;
    11 void work()
    12 {
    13     int sum=1;
    14     for(int i=1;i<=n;i++)
    15     {
    16         sum*=i;
    17         while(sum%10==0)
    18             sum/=10;
    19         sum%=100000;
    20     }
    21     printf("%5d -> %d
    ", n, sum% 10);
    22 }
    23 int main()
    24 {
    25     while(cin>>n)
    26     {
    27         work();
    28     }
    29     return 0;
    30 }
    View Code

    uva408

    题目大意:给出n , mod ,step = (n + step) % mod ,问,step是否能取到0~mod - 1之间所有的数。

    解题思路:题目可以等价于判断n 和 mod 的最大公约数是否为1.

     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 int gcd(int a,int b)
     5 {
     6     return b ? gcd(b,a%b):a;
     7 }
     8 int main()
     9 {
    10     int n,mod;
    11     while(cin>>n>>mod)
    12     {
    13         printf("%10d%10d", n, mod);
    14         if(gcd(n,mod)==1)
    15             cout<<"    Good Choice"<<endl<<endl;
    16         else
    17             cout<<"    Bad Choice"<<endl<<endl;
    18     }
    19     return 0;
    20 }
    View Code

     uva10061

    这一题我觉得真的很有必要探究一下了,最开始拍了个暴力,然后WA了,后来发现数据范围肯定超过了,去网上看了题解,才知道应该怎么做

    题意:计算在m进制下n!尾数有多少个0,有多少位数

    题解:

    1.对于有多少位数,比较容易求解,可以直接log(10,n)+1,换成m进制就是log(m,n)+1,而log的计算规则,log(m,n!) = log(m,1)+log(m,2)+......+log(m,n)

    2.对于有多少个位数0,我们要先把n!分解因数,并记录各个因数的个数,看其中有多少能够凑成m的整数倍,然后枚举2~m即可

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 #include<vector>
     7 #include<string>
     8 #include<cctype>
     9 using namespace std;
    10 const int maxn=805;
    11 int a[maxn];
    12 int n,m;
    13 int main()
    14 {
    15     while(cin>>n>>m)
    16     {
    17         double digit=0;
    18         memset(a,0,sizeof(a));
    19         for(int i=2;i<=n;i++)
    20         {
    21             //求有多少位数
    22             digit+=log10(i)/log10(m);
    23 
    24             //分解因数
    25             for(int temp=i,j=2;j<=m;j++)
    26             {
    27                 while(temp%j==0)
    28                 {
    29                     a[j]++;
    30                     temp/=j;
    31                 }
    32             }
    33         }
    34         //求阶乘有多少个零
    35         int num=0;
    36         for(;;)
    37         {
    38             int temp=m;
    39             for(int i=2;i<=m;i++)
    40             {
    41                 while(a[i]&&temp%i==0)
    42                 {
    43                     a[i]--;
    44                     temp/=i;
    45                 }
    46             }
    47             if(temp==1)  num++;
    48             else  break;
    49         }
    50         cout<<num<<" "<<(int)digit+1<<endl;
    51     }
    52     return 0;
    53 }
    View Code

     

  • 相关阅读:
    HDU3371--Connect the Cities
    HDU1232--畅通工程
    HDU1102--Constructing Roads
    HDU1856--More is better
    HDU1325--Is It A Tree?
    HDU1272--小希的迷宫
    HDU1213--How Many Tables
    lnmp 实现owncloud
    lemp 编译安装 不完整版
    dns 视图
  • 原文地址:https://www.cnblogs.com/wolf940509/p/4506765.html
Copyright © 2011-2022 走看看