uva575:这道题目没什么好说的
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
uva10110:
这道题目考虑最后一个数的因子个数,如果是偶数则是关闭的,奇数则是开着的,显然一般数都是偶数,只有一种情况,是全部平方数的时候才是奇数,于是判断
sqrt(n)*sqrt(n)是否等于n即可
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
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就跳出
以此类推,直到乘积+原来的进位==最低位。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
uva568
开始交上去,就贡献了1WA,现在来帖一下别人的解题思路:
循序從1~10000一直乘上去,由於最大值是到10000,因此每次計算完留下結尾非零的五位數再去做乘法,即可得到正確的最後一位非零數字
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
uva408
题目大意:给出n , mod ,step = (n + step) % mod ,问,step是否能取到0~mod - 1之间所有的数。
解题思路:题目可以等价于判断n 和 mod 的最大公约数是否为1.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
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即可
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }