刘汝佳 算法入门 第一版 Uva题目集合(六)
注: 部分完成
Uva 575
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
string SkewBinary;
int main()
{
int num, len, Carry;
while(cin>>SkewBinary){
if(SkewBinary[0] == '0') break;
num = 0;
len = SkewBinary.size() - 1;
Carry = 0;
for(int i = len; i >= 0; i--){
Carry = (Carry + 1) * 2 - 1;
num += Carry * (SkewBinary[i] - '0');
}
cout<<num<<endl;
}
return 0;
}
Uva 10110
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
long long n;
while(cin>>n){
if(n==0)break;
long long flag;
flag=(int)sqrt((double)n);
if(flag*flag==n)
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
return 0;
}
Uva 550
#include <stdio.h>
int main( )
{
int x,y,z;
int sum,mod,m,total;
while( ~scanf("%d%d%d",&x,&y,&z) ){
if( y !=0 ){
total = m = sum = 0;
mod = y;
while( sum != y ){
sum = z * mod + m;
m = sum / x;
mod = sum % x;
total++;
}
printf("%d\n",total);
}
else
printf("1\n");
}
return 0;
}
Uva 568
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
long long last[10005];
int main(){
//打表计算保留最后6位
last[0] = 0L;last[1] = 1L;
for ( int i = 2 ; i <= 10000 ; ++ i ) {
last[i] = last[i-1]*i;
while ( last[i]%10L == 0L )
last[i] /= 10L;
last[i] %= 1000000L;
}
int n;
while ( ~scanf("%d",&n) )
printf("%5d -> %lld\n",n,last[n]%10L);
return 0;
}
Uva 408
#include <iostream>
#include <cstdio>
using namespace std;
int gcd(int a, int b){
return b ? gcd(b,a%b) : a;
}
int main()
{
int s, m;
while(cin >> s >> m){
if (gcd(s, m) == 1)
printf("%10d%10d Good Choice\n\n", s, m);
else
printf("%10d%10d Bad Choice\n\n", s, m);
}
return 0;
}
/*
假设seed(x)可遍历 0..mod-1,则 good choice;
反过来讲,若存在不能遍历的数字,1必是其中一个;
*/
Uva 10061
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
using namespace std;
double dig[1<<20];
int f( int n, int b ){
if ( n < b ) return 0;
else return n/b + f( n/b, b );
}
int main()
{
dig[0] = 0.0;
for ( int i = 1 ; i < (1<<20) ; ++ i )
dig[i] = dig[i-1] + log(i+0.0);
int b,n,mbase,base,count;
while ( cin >> n >> b ) {
//计算base的最大质因数
mbase = 1,base = b;
for ( int i = 2 ; i <= base ; ++ i ) {
count = 0;
while ( base%i == 0 ) {
mbase = i;
base /= i;
count ++;
}
}
cout << f( n, mbase )/count << " ";
cout << int(dig[n]/log(b+0.0)+1e-8+1) << endl;
}
return 0;
}
Uva 10392
#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
int main()
{
long long num, i;
while(cin>>num){
if(num < 0) break;
for(i = 2; i <= (int)sqrt(num); i++)
while(num % i == 0){
cout<<" ";
cout<<i<<endl;
num /= i;
}
if(num > 1) cout<<" "<<num<<endl;
cout<<endl;
}
}