- На заданном отрезке [а,b] необходимо определить все числа, у которых суммы цифр в десятичной и троичной системах счисления совпадают. Числа а и b - целые, а<=b<=1000. (Олимпиада Минской области, 1995)
Пример.
Ввод: |
Вывод: |
1 8 (a,b) |
1 (результирующие числа по одному в строке)
2
|
Алгоритм
-
#include <iostream>
-
using namespace std;
-
int sumofnum(int x){
-
int y=0;
-
while(x>0){
-
y+=x%10;
-
x/=10;
-
}
-
return(y);
-
}
-
-
int transtosumofnum(int x){
-
int y=0, a=729;
-
while(x>0){
-
while(x>=a){
-
y+=1;
-
x-=a;
-
}
-
a/=3;
-
}
-
return(y);
-
}
-
-
int main(){
-
int i, a, b;
-
cin >> a >> b;
-
for(i=a; i<=b; i++)
-
if(sumofnum(i)==transtosumofnum(i))
-
cout << i << endl;
-
system("pause");
-
return(0);
-
}
-
- Найти такие простые числа, не превосходящие заданного N двоичная запись которых представляет собой симметричную последовательность нулей и единиц (начинающуюся с 1). (Олимпиада Минской области, 1993)
Алгоритм
#include <iostream>
#include <queue>
#include <stack>
using namespace std;
int main(){
int i, x, n, j;
cin >> n;
int a[n+1];
for(i=1; i<n+1; i++)
a[i]=1;
for(i=2; i<n+1; i++)
if(a[i]!=0)
for(j=i*2; j<n+1; j+=i)
a[j]=0;
stack <int> s;
queue <int> q;
for(i=1; i<n+1; i++){
x=i;
j=0;
if(a[i]==1){
while(x>0){
s.push(x%2);
q.push(x%2);
x/=2;
}
while(!s.empty()){
if(s.top()==q.front()){
s.pop();
q.pop();
}
else while(!s.empty()){
s.pop();
q.pop();
j=1;
}
}
if(j!=1) cout << i << endl;
}
}
system("pause");
return(0);
}