算法竞赛入门经典中的基础数学题

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", 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

 

 

 

 

 

 

posted @ 2015-05-15 20:13  wolf940509  阅读(347)  评论(0编辑  收藏  举报